【TA/Unity】Shader基础结构
目录
- 创建Shader
- 基本结构
- Properties
- SubShader
- 代码总览
创建Shader
右键资源浏览器,通过Create>Shader菜单创建Shader文件。
基本结构
Shader "Learn/Shader" {Properties {// ...}SubShader {Pass {CGPROGRAM// ...ENDCG}}
}
Properties
Properties {_float("Float", Float) = 0.0 // 浮点数_Range("Range", Range(0.0, 1.0)) = 0.0 // _Vector("Vector", Vector) = (1, 1, 1) // 向量_Color("Color", Color) = (0.5, 0.5, 0.5, 0.5) // 颜色_Texture("Texture", 2D) = "black"{} // 贴图}
-
属性语法:【属性名称 (“显示名称”, 参数类型) = 默认值】
-
在此声明变量后可以在材质球的细节面板中查看、编辑变量值。
-
使用时,还需要在Pass中声明相同类型、名称的变量。
SubShader
SubShader {Pass {CGPROGRAM#pragma vertex Vert#pragma fragment Fragfloat3 _Light_;float4 _Color_;struct Appdata {float4 Vertex : POSITION;float3 Normal : NORMAL;};struct V2F {float4 Vertex : SV_POSITION;float3 Normal : NORMAL;};V2F Vert(Appdata _data) {V2F v2f;float4 pos = mul(unity_MatrixMVP, _data.Vertex);v2f.Vertex = pos;v2f.Normal = _data.Normal;return v2f;}float4 Frag(V2F _v2f) : SV_Target {float4 color = dot(_v2f.Normal, _Light_) * _Color_;return color;}ENDCG}}
- SubShader:可以有多个SubShader,显卡从第一个SubShader开始运行,如果一个SubShader无法运行完成,自动运行下一个SubShader。
- Pass:Pass理解为一个GPU渲染管线。在这里完成:获取模型数据;顶点Shader;图元装配及光栅化;片段Shader;输出合并等工作。可以有多个Pass。
- pragma vertex/fragment:指定顶点着色器、片段着色器函数名称,在后面的代码中声明这些函数,在其中编写顶点、片段着色器代码。
- Properties中声明的变量,要在此再次声明才可以使用。
- 定义结构体,主要是传递给顶点着色器的数据、以及顶点着色器传递给片段着色器的数据。
- 属性语法:【属性类型 属性名称 : 特定语义词】。
- 着色器函数:实现上文中指定的着色器。
代码总览
Shader "Learn/Shader" { // Shader名称Properties {// 属性语法:属性名称("显示名称", 参数类型) = 默认值// 使用时需要在Pass中声明相同类型、名称的变量_float("Float", Float) = 0.0 // 浮点数_Range("Range", Range(0.0, 1.0)) = 0.0 // _Vector("Vector", Vector) = (1, 1, 1) // 向量_Color("Color", Color) = (0.5, 0.5, 0.5, 0.5) // 颜色_Texture("Texture", 2D) = "black"{} // 贴图}// SubShader可以有多个,显卡运行效果时从第一个SubShader开始//如果一个SubShader无法运行完成,自动运行下一个SubShaderSubShader {// Pass理解为一个GPU渲染管线// 在这里完成:获取模型数据;顶点Shader;图元装配及光栅化;片段Shader;输出合并等工作Pass {CGPROGRAM#pragma vertex Vert // 指定顶点Shader名称为vert#pragma fragment Frag // 指定片段Shader名称为frag// Properties中的变量float3 _Vector_; float4 _Color_;// 输入数据的结构体struct Appdata {// 属性语法:属性类型 属性名称 : 特定语义词float4 Vertex : POSITION;float3 Normal : NORMAL;};// 顶点Shader传递给片段着色器的结构体struct V2F {float4 Vertex : SV_POSITION;float3 Normal : NORMAL;};// 顶点ShaderV2F Vert(Appdata _data) {V2F v2f;float4 pos = mul(unity_MatrixMVP, _data.Vertex); // MVP矩阵变换v2f.Vertex = pos;v2f.Normal = _data.Normal;return v2f;}// 片段Shaderfloat4 Frag(V2F _v2f) : SV_Target { // 渲染的目标SV_Targetfloat4 color = dot(_v2f.Normal, _Light_) * _Color_; // Lambert光照模型return color;}ENDCG}}
}
正春华枝俏,待秋实果茂,愿与君共勉