我们看到了SV_POSITION,POSITION,COLOR0等。这些是CG/HLSL提供的语义。语义实际上就是一个赋给Shader输入输出的字符串,这个字符串表达了这个参数的含义。通俗的讲,这些语义可以让Shader知道从哪里读取数据,并把数据输出到哪里,这在Shader中是不可缺少的。
Unity为了方便对模型数据的传输,对一些语义进行了特别的规定。尤其是顶点着色器的输入结构体,像POSITION,NORMAL,TANGENT,TEXCOORD0,Unity会自动识别这些语义,对应的把模型坐标,法线,切线,第一组纹理坐标赋给它们。但对于顶点着色器的输出,也就是片元着色器的输入结构体来说,我们可以自行决定一些语义传递的数据,比如我们在会常用TEXCOORD系列传递一些坐标,颜色啥的数据,在这里它就不是纹理坐标了。
DirectX10以后,有了一种新的语义类型,就是系统数值语义(system-value semantics)。这类语义以SV开头,SV代表系统数值。比如用SV_POSITION修饰顶点着色器的输出变量pos,则pos就是齐次裁剪空间中的坐标。这些语义描述的变量是不可以随便赋值的,流水线需要使用它们完成特定的目的。比如SV_POSITION修饰的变量经过光栅化后会显示在屏幕上。
下表总结了应用阶段传递模型数据给顶点着色器是Unity常用的语义:
从应用阶段传递模型数据给顶点着色器时常用的语义
语义 | 概要 |
---|---|
POSITION | 模型空间中的顶点位置,通常是float4类型 |
TANGENT | 顶点切线,float4 |
TEXCOORD0 | 纹理坐标, float2,float4 |
COLOR | 顶点颜色,float4,fixed4 |
NORMAL | 顶点法线,float3 |
TEXCOORDn中n的数目和Shader Model有关,Shader Model 2(Unity默认的Shader Model版本)和3中,n等于8,Shader Model 4和5中,n等于16。通常一个模型的纹理坐标组数不超过2,用TEXCOORD0和TEXCOORD1就够了。在内置的结构体appdata_full中,最多使用6个纹理坐标。
顶点着色器传递给片元着色器常用语义
语义 | 概要 |
---|---|
SV_POSITION | 裁剪空间中的顶点位置 ,结构体中必须包含一个用该语义的变量 |
COLOR1 | 第二组顶点颜色 |
COLOR0 | 第一组顶点颜色 |
TEXCOORDn | 输出纹理坐标 |
除了SV_POSITION有特别含义,其他语义没有明确要求。也就是说我们可以存任何值到这些语义描述的变量中。通常我们习惯用TEXCOORDn来传递我们自定义的数值。
片元着色器输出常用语义
语义 | 概要 |
---|---|
SV_Target | 输出值存储在渲染目标中 |