gpt4 book ai didi

glsl - HLSL为什么具有语义?

转载 作者:行者123 更新时间:2023-12-03 23:41:19 25 4
gpt4 key购买 nike

在HLSL中,我必须使用语义将信息从顶点着色器传递到片段着色器。在GLSL中,不需要语义。语义学的客观好处是什么?

示例: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;
}


我看到了 foo中的 barVS_OUTPUT如何连接到片段着色器中 foo中的 barmain。我不明白的是为什么我要手动选择语义来承载数据。为什么与GLSL一样,DirectX无法在链接着色器时仅弄清楚将数据放置在何处并进行连接?

手动指定语义是否还有其他更具体的优势,还是只是汇编语言着色器时代遗留下来的?选择说TEXCOORD4比选择COLOR2或BINORMAL1有速度上的优势吗?

我知道语义可以暗示含义, foobar没有意义,但是如果 foo不是TEXCOORD且 bar不是颜色,它们也可以使含义模糊。我们不将语义放在C#或C ++或JavaScript变量上,为什么HLSL需要它们?

最佳答案

简而言之,(旧的)glsl将这种变化用于变量命名(请注意,现在不建议使用变化)。

语义的一个明显好处是,在阶段之间不需要相同的变量名,因此DirectX管道通过语义而不是变量名进行匹配,只要布局兼容,就可以重新排列数据。

如果用foo2重命名foo,则可能需要在所有着色器(以及随后的所有着色器)中替换此名称。使用语义,您不需要这个。

另外,由于不需要精确匹配,因此可以更轻松地在着色器阶段之间进行分离。

例如:

您可以有一个像这样的顶点着色器:

struct vsInput
{
float4 PosO : POSITION;
float3 Norm: NORMAL;
float4 TexCd : TEXCOORD0;
};

struct vsOut
{
float4 PosWVP : SV_POSITION;
float4 TexCd : TEXCOORD0;
float3 NormView : NORMAL;
};

vsOut VS(vsInput input)
{
//Do you processing here
}


像这样的像素着色器:

struct psInput
{
float4 PosWVP: SV_POSITION;
float4 TexCd: TEXCOORD0;
};


由于顶点着色器输出提供了像素着色器所需的所有输入,因此这是完全有效的。法线将被忽略,并且不会提供给像素着色器。

但是之后,您可以交换到可能需要法线的新像素着色器,而无需使用另一个Vertex Shader实现。您也可以只交换PixelShader,从而节省一些API调用( Separate Shader Objects扩展名与OpenGL等效)。

因此,在某些方面,语义为您提供了一种在各个阶段之间封装In / Out的方法,并且由于您引用了其他语言,所以这等效于使用属性/设置程序/指针地址...

速度方面,命名没有什么区别(当然,除了系统语言之外,几乎可以使用任何方式命名语义)。不同的布局位置确实意味着成功(管道将为您重新组织,但也将发出警告,至少在DirectX中如此)。

OpenGL还提供了 Layout Qualifier,其大致等效(技术上有所不同,但大致遵循相同的概念)。

希望有帮助。

关于glsl - HLSL为什么具有语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22064165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com