在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?