C++ D3D11中语义和顶点布局的意义是什么?

C++ D3D11中语义和顶点布局的意义是什么?,c++,shader,direct3d,direct3d11,C++,Shader,Direct3d,Direct3d11,语义学的目的是什么 如果我有这样的顶点布局: struct VS_Input { float4 position : COLOR; float4 color : POSITION; }; 我把两个成员的语义颠倒过来,这有关系吗 如果我必须向Direct3D发送逐顶点结构,为什么它不能按原样复制我的数据 如果我为direct3D提供的顶点的布局与着色器的布局不匹配,会发生什么?例如,如果我将以下顶点传递到上面的着色器中 struct MyVertex { Vec4 pos

语义学的目的是什么

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

struct VS_Input
{
    float4 position : COLOR;
    float4 color : POSITION;
};
我把两个成员的语义颠倒过来,这有关系吗

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

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

struct MyVertex
{
    Vec4 pos;
    Vec2 tex;
    Vec4 col;
};
在D3D文档中,它说将产生一个警告,并且我的数据将被“重新解释”

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


如果上述情况不正确,那么为什么D3D需要显式顶点布局?

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


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

谢谢。我假设顶点布局和着色器结构必须对应1对1。此外,您必须为变量提供名称和语义这一事实似乎有点多余,但当我想到它时,我认为使用“pos”而不是“POSITION”在我的整个着色器代码中,这一点要舒服一些。解耦顶点布局和着色器输入布局的原因是,您可能希望将相同的顶点数据用于需要不同输入的不同着色器。一个常见的示例是深度预过程或阴影渲染过程,在该过程中,您只需要访问着色器中的位置。通过将位置存储在自己的缓冲区中,可以避免在仅深度着色器中获取其他顶点组件时浪费内存带宽。稍后在照明/着色过程中渲染对象时,可能需要其他顶点组件,如纹理坐标、法线等。@albundy您可能会发现编译一个简单的着色器进行组装并查看生成的ASM文件(通过使用/Fc开关调用fxc.exe)很有帮助。当您这样做时,编译器将编写一个长长的注释部分,其中包含有关如何链接各种缓冲区的有趣信息。然后,您可以开始处理输入和格式规范以及它们的交互方式。