本章导图
一、实现顶点/片元着色器
(一)一个简单的顶点/片元着色器
- 1.新建一个几何体:在GameObject里新建一个球体
- 2.新建一个Unity Shader
- 3.新建一个材质,把Shader赋给他
- 4.再把材质赋给对应的球体
(二)编辑Unity Shader
1.示例如下:
结果如下:
- 第一行:Shader的名字
- SubShader语义块:由于使用了默认的渲染设置和标签设置,所以不需要设置。
- Pass语义块:同样地使用了默认的渲染设置和标签设置
- 接下来是由CGPROGRAM和ENDCG包围的CG代码片段
- 编译指令 # pragram vertex/fragment name 表示了顶点着色器/片段着色器的函数名
- 函数部分::后面代表了变量的语义。例如:POSITION 表示输入的是模型空间的位置,SV——POSITION表示输出的是顶点着色器的输出是裁剪空间的位置。
- SV_Target:表示输出到一个渲染对象上,这里默认是帧缓存
- UNIty_MATRIX_MVP:将模型空间的坐标通过MVP变换到裁剪空间上去。
2.用一个结构体来定义顶点着色器的输入
- 结构体成员格式: Type(数据类型) Name : Semantic (数据对应的语义)
- 对于顶点着色器的输出,unity支持的语义由:POSITION,TANGENT,NORMAL,TEXCOORD0,TEXCOORD1,TEXCOORD2,TEXCOORD3,COLOR等
- 注意,语义不可省略,不然着色器就迷茫了
3.顶点着色器和片元着色器之间的通信
- 示例:
- 注意:顶点着色器是逐顶点调用的,片元着色器是逐片元调用的。片元着色器的输入实际上是把顶点着色器的输出进行插值后得到的结果。
4.着色器属性
- 作用:为材质提供方便调节的参数
- 位置:Properties语义块中
- 示例:其中,'_Color’为一个属性,类型是Color,初始值是(1.0,1.0,1.0,1.0)
- 另外,为了在CG模块中能够访问到这个属性,需要在CG代码块中定义一个与Properti语义块中属性相匹配的变量
5.语义
- 定义:语义是赋给Shader输入和输出的字符串,表示了这个参数的含义
- 阶段一:从应用阶段传递模型数据给顶点着色器时Unity支持的常用语义
- 阶段二:从顶点着色器传递数据给片元着色器时Unity使用的常用语义
- 阶段三:片元着色器输出时Unity支持的常用语义
- 示例