4

语义的目的是什么?

如果我有这样的顶点布局:

struct VS_Input
{
    float4 position : COLOR;
    float4 color : POSITION;
};

我颠倒两个成员的语义真的有关系吗?

如果我必须为每个顶点发送 Direct3D 结构,为什么它不能按原样复制我的数据?

如果我为 direct3D 提供的顶点布局与着色器的布局不匹配,会发生什么情况?例如,如果我将以下顶点传递给上述着色器?

struct MyVertex
{
    Vec4 pos;
    Vec2 tex;
    Vec4 col;
};

在 D3D 文档中,它说会产生警告,并且我的数据将被“重新解释”

这是否意味着像 reinterpret_cast<> 中那样“重新解释”?比如,我的着色器会尝试使用纹理坐标和一半颜色作为着色器中的颜色?或者它会在我的顶点布局中搜索与每个语义匹配的元素并将输入洗牌到正确的位置以使着色器工作?

如果上述情况不成立,那么为什么 D3D 需要明确的顶点布局?

4

1 回答 1

4

语义用于将顶点缓冲区绑定到着色器输入。在 D3D11 中,缓冲区只是用于存储数据的内存块,具有输入签名的着色器描述了他们期望的输入,输入布局表示缓冲区和着色器之间的绑定,并描述如何解释缓冲区中的数据. 语义的作用只是将缓冲区布局描述中的元素与相应的着色器输入进行匹配,只要它们匹配,名称并不重要。

创建输入布局对象时,您可以正确指定顶点数据的布局。如果您的输入布局与数据内存中的实际布局不匹配,那么它实际上就像使用 reinterpret_cast 一样,您将呈现垃圾。提供输入元素和着色器输入之间的语义正确匹配,但是它们将被正确绑定,并且元素顺序之类的事情无关紧要。它是描述如何将顶点缓冲区中的数据元素传递给着色器输入的语义。

于 2013-05-27T18:19:13.990 回答