语义的目的是什么?
如果我有这样的顶点布局:
struct VS_Input
{
float4 position : COLOR;
float4 color : POSITION;
};
我是否真的重要的是我颠倒了两个成员的语义?
如果我必须为每个顶点发送一个结构的Direct3D,为什么它不能按原样复制我的数据?
如果我为direct3D提供一个顶点,其布局与着色器的布局不匹配,会发生什么?例如,如果我将以下顶点传递给上面的着色器?
struct MyVertex
{
Vec4 pos;
Vec2 tex;
Vec4 col;
};
在D3D文档中,它说会产生警告,我的数据将被“重新解释”
这是否意味着“重新解释”,如reinterpret_cast<>?比如,我的着色器会尝试使用纹理坐标和一半颜色作为着色器中的颜色?或者它会在我的顶点布局中搜索与每个语义匹配的元素,并将输入混合到正确的位置以使着色器工作?
如果上述情况不成立,那为什么D3D需要一个明确的顶点布局?
答案 0 :(得分:4)
语义用于将顶点缓冲区绑定到着色器输入。在D3D11中,您有缓冲区,它只是用于存储数据的内存块,着色器具有描述其期望输入的输入签名,输入布局表示缓冲区和着色器之间的绑定,并描述如何解释缓冲区中的数据。语义的作用只是将缓冲区布局描述中的元素与相应的着色器输入相匹配,只要它们匹配,名称就不是很重要。
在创建输入布局对象时,您可以正确指定顶点数据的布局。如果您的输入布局与数据内存中的实际布局不匹配,那么它将有效地使用reinterpret_cast并且您将渲染垃圾。在输入元素和着色器输入之间正确匹配语义,但它们将被正确绑定,并且元素顺序之类的事情无关紧要。它的语义描述了如何将顶点缓冲区中的数据元素传递给着色器的输入。