UnityShader-基础篇
一段基础的UnityShader代码如下(该代码无Properties部分):
Shader "Custom/StandardShader"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct a2v{
float4 pos : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
struct v2f{
float4 pos : SV_POSITION;
float3 col : COLOR;
};
v2f vert(a2v i){
v2f o;
o.pos = UnityObjectToClipPos(i.pos);
o.col = i.normal * 0.5 + float3(0.5, 0.5, 0.5);
return o;
}
half4 frag(v2f i) : SV_TARGET0{
return half4(i.col, 1.0);
}
ENDCG
}
}
}
自定义结构体:
a2v : application to vertex,从应用程序到顶点着色器,一般会包含顶点坐标(POSITION),顶点法线(NORMAL)等参数信息。
v2f : vertex to fragment,从顶点着色器到片元着色器,一般必须包含顶点坐标信息(SV_POSITION)。
除了自定义结构体外,"UnityCG.cginc"中也包含一部分预配置的结构体:
同时,该段代码中也使用了许多的shader语义。
语义,其实就是一个赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义。通俗的讲这些语义可以让Shader知道从哪读取输送到哪里去,他们是在CG/HLSL的shader流水线中是不可避免。
部分常使用的语义有:
更多有关unityshader语义与变量的内容:UnityShader常用语义和变量 - 知乎 (zhihu.com)
语义TEXCOORDn,为顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标以此类推,通常是float2或float4类型。语义TEXCOORDn即会出现在顶点着色器中,也经常出现在片元着色器中。出现在顶点着色器中时,一般是利用贴图实现对顶点的偏移等效果,如波浪效果;出现在片元着色器中时,一般是作为材质的贴图使用。
而SV_Target 等同于DirectX9中的COLOR,但我们最好用SV_Target。表示的是将输出数据
传递给render_target(渲染目标)。
为了让Shader能够在所有平台上正常工作,我们应该尽可能使用下面的语义来描述Shader的输入输出变量。