顶点着色器输入语义
语义:
可以理解为是一个标记。
最终也就是让Shader知道在哪里读数据,并且把数据输出到哪里。
例如:
struct a2v
{
float4 texcoord : TEXCOORD0
}
上面a2v输入结构体中的语义 :TEXCOORD0
就是将第一套uv存储在变量 texcoord 中
如果在输出结构体v2f中我们仍然可以用
:TEXCOORD0 (即使输入结构体a2v中已经有:TEXCOORD0了我们仍然可以使用)这是因为
语义的另一个功能就是寄存器。
:SV_POSITION
(顶点着色器后使用)
例:float4 vert ( float4 v : POSITION ) : SV_POSITION
:SV_TARGET
(片元着色器后使用)
例:fixed4 frag ( ) :SV_TARGET
以上2种语义是特殊语义,不能乱用。
有时候我们能看见 SV_POSITION & SV_TARGETSV 被写成了 POSITION & TARGET 这是因为在DX10 之后引入了一个叫系统数值的语义。 这时候POSITION & TARGET 就有了他自己的目的需要去做的事情。所以我们就用SV_POSITION & SV_TARGETSV
如果不使用 SV_POSITION & SV_TARGETSV 而用 POSITION & TARGET 我们会发现在PS4上会出错。
我们理解为在DX10 之后为了兼容某些硬件,我们引入了新的语义 SV_POSITION & SV_TARGETSV 而 SV_POSITION & SV_TARGETSV 是包含 POSITION & TARGET。
顶点着色器输入结构体种的语义笔记
:POSITION
(模型空间中的顶点位置,通常是float4类型)
: NORMAL
(顶点法线,通常是float3类型)
:TANGENT
(顶点切线,通常是float4类型)
TEXCOORDn
( 顶点的纹理坐标,TEXCOOD0表示第一组uv坐标纹理通常是float2 , float4类型 )
(Shader Model2 & 3 可以支持最多 8 个TEXCOORD)
(Shader Model4 & 5 可以支持最多 16 个TEXCOORD)
COLOR
(顶点颜色,通常是fixed4类型)