Unity|Unity Shader 入门(二)极简Shader实例

一言不合上代码

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" }

效果图
Unity|Unity Shader 入门(二)极简Shader实例
文章图片
图2-1 代码分析
Shader "Demo/Diffuse Texture"

【Unity|Unity Shader 入门(二)极简Shader实例】声明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进行渲染。

    推荐阅读