? ? ? ? 以下内容主要是个人理解,如有错误,欢迎严厉批评指正。
? ? ? ? 不是必要的。
? ? ? ? 使用HLSL和CG语言来编写Shader需要语义,使用GLSL编写Shader不需要。
????????语义实际上是特定数据存储位置的标记。
? ? ? ? 通常在??vertex??对应的方法(就是通常命名为?vert?或者 UnlitPassVertex 之类的那个方法)中使用的输入结构体中的语义与内容之间是严格相关的,参考下面的代码中的结构体:
struct attribute
{
float3 posOS:POSITION;
float2 uv:TEXCOORD0;
};
? ? ? ? 在HLSL语言环境下,可以认为应用程序向GPU传递数据时,事先约定好在POSITION语义所对应的存储位置是存放模型基于自身坐标的顶点的位置信息。类似的,TEXCOORD0这个语义所对应的存储位置也是约定好存放模型默认的uv信息的。当一个结构体定义的目的是向??vertex??对应的方法中传递信息的时候,所有变量对于这些约定必须严格遵循,否则取不到正确的数据!
????????如果定义的结构体的用途是将数据从vertex对应的方法处理好再传递给fragment对应的方法(就是通常命名为? frag 或者?UnlitPassFragment 的那个方法),就只有一个SV_POSITION语义是约定好的,这个语义对应的是顶点在裁剪空间中的位置。其它语义并没有约定,所谓语义只对应了一个存储位置,比如下面代码中的uv使用了语义TEXCOORD0,其实你使用NORMAL啥的也行。
struct Varying
{
float4 posCS:SV_POSITION;
float2 uv:TEXCOORD0;
};
? ? ? ? 对于fragment对应的方法的返回值,?SV_TARGET 的语义约定也是必须的,因为程序后续要在SV_TARGET所对应的存储位置取值。示例代码如下:
float4 frag(Varying IN):SV_TARGET
{
float4 texColor = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,IN.uv);
return texColor * _MainColor;
}
????????POSITION? ? ? ? ? ?表示这个变量用于存储模型基于自身坐标的顶点的位置信息。
????????SV_POSITION? ? 指定顶点的位置,通常用于顶点着色器输入。
????????SV_TARGET? ? ? ?指定像素颜色输出的目标缓冲区,通常用于像素着色器输出。
????????TEXCOORD????????指定纹理坐标,用于从纹理中采样颜色。
????????COLOR? ? ? ? ? ? ? ? 指定顶点或像素的颜色。
????????NORMAL? ? ? ? ? ? ?指定顶点或像素的法线向量。
????????TANGENT? ? ? ? ? ?指定顶点或像素的切线向量。
????????BINORMAL? ? ? ? ?指定顶点或像素的副法线向量。
????????DEPTH? ? ? ? ? ? ? ? 深度值