一言不合上代码
Shader "Demo/Diffuse None"{
Properties{
}
SubShader{
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_Tex;
};
void surf(Input IN, inout SurfaceOutput o){
}
ENDCG
}
FallBack "Diffuse"
}
效果图
代码分析
Shader "Demo/Diffuse Texture"
声明Shader并为其指定一个名字,在unity材质面板的Shader选项中可见。
Properties{
}
定义着色器的属性,作为输入提供为所有子着色器,在材质上作为可调参数显示出来。
SubShader{}
子着色器内容
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_Tex;
};
void surf(Input IN, inout SurfaceOutput o){
}
ENDCG
CGPROGRAM是一个开始标记,表明从这里开始是一段CG程序。最后一行的ENDCG表明CG程序到此结束。
#pragma surface surf Lambert
上面的代码表明这是一段编译指令,surface表示声明的是一个表面着色器,surf为表面着色器的实现方法,Lambert表示采用的光照模型(普通的diffuse)
struct Input{
float2 uv_Tex;
};
由于方法surf(声明的suface的实现方法)有两个参数(为unity指定),第一个参数需要一个Input类型的结构体(Input需自定义,但必须命名为Input,结构体Input如果没有任何成员变量,unity编译会报错,所以本例定义了uv_Tex)CG程序约定,在一个贴图变量之前加上uv两个字母,表示提取它的uv值(其实就是贴图上点的二维坐标 )。之后在surf程序中可以直接通过访问uv_Tex来取得贴图当前需要计算的点的坐标值了。
FallBack "Diffuse"
如果没有适合的子着色器,则调用unity内置着色器Diffuse进行渲染。