shader刚学一点点,做个笔记 Properties { 属性 可以在外部调节类似于C#中 public int a; _Color("_Color",color)=(1,1,1,1) 属性(外部显示的名称,类型)=值 } // SubShader可以有很多个 显卡运行效果的时候 从第一个Shader开始, // 如果第一个SubShader里面的效果都可以实现,那么就使用第一个SubShader // 如果显卡发现这个SubShader里面的效果它实现不了 他会自动执行下一个SubShader SubShader { Pass // 一个Pass相当于一个方法 { CGPROGRAM … ENDCG } }
语义: 应用阶段到顶点着色器时用常用的语义如下: POSITION:模型空间中的顶点坐标 NORMAL:模型空间中的法线方向 TANGENT:模型空间中的切线方向 TEXCOORDn:模型空间中第n组纹理坐标 COLOR:模型空间中顶点的颜色
顶点着色器传递数据给片元着色器时常用的语义如下: SV_POSITION:裁剪空间中的顶点坐标 COLOR0:输出第一组顶点颜色,不是必须 COLOR1:输出第二组顶点颜色,不是必须 TEXCOORDn:输出第n组纹理坐标,不是必须
片元着色器输出数据到unity阶段常用的语义如下: SV_Target:输出值存储到渲染目标中。
可以把语义写在结构体中 struct a2v { float4 vertex:POSITION; // 告诉unity把模型空间下的顶点坐标填充给vertex float3 normal:NORMAL; // 告诉unity把模型空间下的法线方向填充给normal float4 texcoord:TEXCOORD0; // 告诉unity把第一套纹理坐标填充给texcoord };
struct v2f { float4 position:SV_POSITION; float3 temp:COLOR0; };
v2f vert(a2v v) { v2f f; f.position = UnityObjectToClipPos(v.vertex); 矩阵,作用:用来完成模型空间到剪裁空间的转换 f.temp = v.normal; temp用来存法线位置 return f; }
float frag(v2f f) : SV_Target 输出值存储到渲染目标中 { return fixed4(f.temp,1); }
在unity5.6以上版本中,shader中的UNITY_MATRIX_MVP将会被UnityObjectToClipPos替代
|