在HLSL中,我必须使用语义将信息从顶点着色器传递到片段着色器。在GLSL中,不需要语义。语义的客观利益是什么?为什么HLSL具有语义?
实施例:GLSL
顶点着色器
varying vec4 foo
varying vec4 bar;
void main() {
...
foo = ...
bar = ...
}
片段着色器
varying vec4 foo
varying vec4 bar;
void main() {
gl_FragColor = foo * bar;
}
实施例:HLSL
顶点着色器
struct VS_OUTPUT
{
float4 foo : TEXCOORD3;
float4 bar : COLOR2;
}
VS_OUTPUT whatever()
{
VS_OUTPUT out;
out.foo = ...
out.bar = ...
return out;
}
像素着色器
void main(float4 foo : TEXCOORD3,
float4 bar : COLOR2) : COLOR
{
return foo * bar;
}
我看到如何在VS_OUTPUT
foo
和bar
获得片段着色器连接到foo
和bar
在main
。我没有得到的是为什么我手动选择语义来携带数据。为什么像GLSL一样,DirectX不能确定在连接着色器时将数据放置在哪里并将其连接起来?
手动指定语义还有一些更具体的优点,还是仅仅从汇编语言着色器日期剩下来了吗?在COLOR2或BINORMAL1上选择TEXCOORD4是否有一些速度优势?
我得到的语义可以暗示的意思,也没有意义foo
或bar
但它们也隐晦的意思是刚刚好,如果foo
不是TEXCOORD和bar
并不出彩。我们不把语义放在C#或C++或JavaScript变量上,为什么他们需要HLSL?