前言
以下内容主要是个人理解,如有错误,欢迎严厉批评指正。
一、语义的形式在Shader中是必要的吗?
不是必要的。
使用HLSL和CG语言来编写Shader需要语义,使用GLSL编写Shader不需要。
二、语义的意义?
-
语义是什么?
语义实际上是特定数据存储位置的标记。
-
vertex对应方法的输入结构体中的语义
通常在 vertex 对应的方法(就是通常命名为 vert 的那个方法)中使用的输入结构体中的语义与内容之间是严格相关的,参考下面的代码中的结构体:
struct appdata
{float3 pos:POSITION;float2 uv:TEXCOORD0;
};
在HLSL语言环境下,可以认为应用程序向GPU传递数据时,事先约定好在POSITION语义所对应的存储位置是存放模型基于自身坐标的顶点的位置信息。类似的,TEXCOORD0这个语义所对应的存储位置也是约定好存放模型默认的uv信息的。当一个结构体定义的目的是向 vertex 对应的方法中传递信息的时候,所有变量对于这些约定必须严格遵循,否则取不到正确的数据!
-
从vertex对应的方法向fragment对应的方法传递内容的结构体中的语义
如果定义的结构体的用途是将数据从vertex对应的方法处理好再传递给fragment对应的方法(就是通常命名为 frag 的那个方法),就只有一个SV_POSITION语义是约定好的,这个语义对应的是顶点在裁剪空间中的位置。其它语义并没有约定,所谓语义只对应了一个存储位置,比如下面代码中的uv使用了语义TEXCOORD0,其实你使用NORMAL啥的也行。
struct v2f
{float4 pos:SV_POSITION;float2 uv:TEXCOORD0;
};
-
fragment对应的方法的返回值的语义
对于fragment对应的方法的返回值, SV_TARGET 的语义约定也是必须的,因为程序后续要在SV_TARGET所对应的存储位置取值。示例代码如下:
float4 frag(v2f 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 深度值