书看到第八章,跟随写了一些例子,但有些数值类型的使用还是需要特别注意,经常需要查阅,在这里做一下总结。
1 ShaderLab属性类型和Cg变量类型的匹配关系
Color、Vector:float4,half4,fixed4
Range、Float:float, half, fixed
2D:sampler2D
3D:sampler3D
Cube:samplerCube
注意:这些属性类型是在定义属性时使用,例如:
1 Shader "Unlit/Test Shader" 2 { 3 Properties 4 { 5 _Color ("Color Tint", Color) = (1, 1, 1, 1) 6 _MainTex ("Main Tex", 2D) = "white" {} 7 _BumpMap ("Normal Map", 2D) = "bump" {} 8 _BumpScale ("Bump Scale", Float) = 1.0 9 _SpecularMask ("Specular Mask", 2D) = "white" {} 10 _SpecularScale ("Specular Scale", Float) = 1.0 11 _Specular ("Specular", Color) = (1, 1, 1, 1) 12 _Gloss ("Gloss", Range (8.0, 256.0)) = 20.0 13 } 14 SubShader{ 15 Pass{ 16 ...... 17 } 18 }
2 Cg/HLSL常用的3种精度的数值类型
float: 32位存储,用在坐标、未归一化的矢量、uv、一些调整参数
half:16位存储,范围 -60000~60000
fixed:11位存储,范围-2.0~2.0,用于存储颜色、归一化后的矢量、在这个范围内的参数等
注意:uv不能用fixed存储,因为可能通过贴图的Tiling和Offset让其范围超过[0, 1]
1 fixed4 _Color; 2 sampler2D _MainTex; 3 float4 _MainTex_ST; 4 sampler2D _BumpMap; 5 float _BumpScale; 6 sampler2D _SpecularMask; 7 float _SpecularScale; 8 fixed4 _Specular; 9 float _Gloss; 10 11 struct a2v 12 { 13 float4 vertex : POSITION; 14 float3 normal : NORMAL; 15 float4 tangent : TANGENT; 16 float4 texcoord : TEXCOORD0; 17 }; 18 19 struct v2f 20 { 21 float4 pos : SV_POSITION; 22 float2 uv : TEXCOORD0; 23 float3 lightDir : TEXCOORD1; 24 float3 viewDir : TEXCOORD2; 25 }; 26 27 v2f vert (a2v v) 28 { 29 v2f o; 30 ...... 31 return o; 32 } 33 34 fixed4 frag (v2f i) : SV_Target 35 { 36 ...... 37 return fixed4(ambient + diffuse + specular, 1.0); 38 }
3 Unity Shader常用语义(寄存器)
就是上面这段代码中的标红部分。它代表了前面那个变量从哪里获得数据或者存储到哪里。
3.1 从应用阶段传递模型数据给顶点着色器时:
POSITION:模型空间中的顶点位置,通常是float4类型
NORMAL:顶点法线,通常是float3类型
TANGENT:顶点切线,通常是float4类型,第四个分量用于存储特殊数值
TEXCOORDn:顶点纹理坐标,通常是float2或float4类型。在Unity Model2和3中,n=8(Unity默认),在4和5中n=16.
COLOR:顶点颜色,通常是fixed4或float4类型
3.2 从顶点着色器传递给片元着色器时:
SV_POSITION:裁剪空间中的顶点坐标,结构体中必须包含一个用该语义的变量
COLOR0:输出第一组顶点颜色,不必需
COLOR1:输出第二组顶点颜色,不必需
TEXCOORD0~7:输出纹理坐标,不必需
3.3 片元着色器输出:
SV_Target: 输出值将会存储到渲染目标(render target)中
注意:一个语义可以使用的寄存器最多只能处理4个浮点值(float),因此对于4x4矩阵,需要拆分成4个float4类型的变量来存储矩阵数据