第一个顶点/片元着色器
Shader "Unity Shaders/SimpleShader" {
Properties{
_Color ("Color Tint",Color) = (1.0,1.0,1.0,1.0)
}
SubShader{
Pass{
CGPROGRAM
//包含文件 使我们可以使用unity提供的一些很有用的变量和帮助函数
#include "UnityCG.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;//需要在CG代码中定义一个与属性名称和类型都匹配的变量
struct a2v {
float4 vertex:POSITION; //模型空间的顶点填充vertex变量
float3 normal:NORMAL; //模型空间的法线方向填充normal变量
float4 texcoord:TEXCOORD0; //用模型的第一套纹理坐标填充texcoord
};
//描述顶点着色器的输出
struct v2f {
float4 pos:SV_POSITION;//pos包含了顶点在裁剪空间中的位置信息
fixed3 color : COLOR0;//COLOR0语义用于存储颜色信息
};
//顶点着色器代码
v2f vert(a2v v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.normal*0.5 + fixed3(0.5, 0.5, 0.5); //把法线的分量范围从[-1.0,1.0]变到[0,1.0]
return o;
}
//片元着色器代码
float4 frag(v2f i) : SV_Target{
fixed3 c = i.color;
c *= _Color.rgb;
return fixed4(c, 1.0);
}
ENDCG
}
}
}
关于上面代码中用到的SV_POSITION、POSITION、COLOR0等语义:
这些语义可以让shader知道,从哪里读取数据,并把数据输出到哪儿。SV开头的语义中,SV代表系统数值。例如SV_POSITION修饰的顶点着色器输出变量pos,即表示pos包含了可用于光栅化的变换后的顶点坐标(即齐次裁剪空间中的坐标)。用这些语义描述的变量是不能随便赋值的,它们会被用于完成特殊的目的。pos变量就会用于光栅化后显示到屏幕上。
注意事项:
渲染平台差异:
1.渲染纹理坐标差异
2.shader语法差异
3.shader语义差异
如果我们的目标平台是移动平台,一定要在手机上测试shader,因为我们的数值类型float,half,fixed在不同平台和GPU上精度有所差异,使用低精度的类型有助于我们提高性能。