2

假设我有一个模型。该模型具有位置、颜色、法线和 2 个纹理坐标的数据。现在假设我有一个输入类型仅为位置和颜色的着色器。但是,此模型的顶点缓冲区格式为:

struct Vertex_PCNT2
{
    D3DXVECTOR3 position;
    D3DXVECTOR4 color;
    D3DXVECTOR3 normal;
    D3DXVECTOR2 tex1;
    D3DXVECTOR2 tex2;
};

尽管这个模型中有关于获取位置和颜色的着色器的信息,但我不能使用它,因为有多余的数据。我能想到的唯一其他解决方案是拥有多个具有相同信息的顶点缓冲区减去几个字段,但这只是多余的。必须有更好的方法。这里有什么帮助吗?

编辑:我想我会在工作前的一段时间内详细说明我的问题。在谈论顶点缓冲区时,我指的是您使用 ID3D11Device::CreateBuffer 创建的 ID3D11Buffer *。在此之前,我用 Vertex_PCNT2 类型填充顶点数组。据我所知,该缓冲区现在永久采用这种格式,因此所有着色器都必须使用这种格式。当数据已经存在时,设置其他缓冲区只会对 ram 造成压力。

4

1 回答 1

3

通常,这是通过为同一个顶点缓冲区创建不同的 InputLayout 来完成的。请记住,InputLayout 可以充当顶点输入数据和顶点着色器的预期输入之间的过滤视图。

InputLayout 正是针对这种场景完成的。它基本上是将原始数据的布局和绑定到顶点着色器输入的布局解耦。

例如,如果您只需要映射位置和颜色,则只需使用包含正确 AlignedByteOffset 集的两个D3D11_INPUT_ELEMENT_DESC元素的数组来实例化输入布局。

在仅选择“POSITION”(偏移量 0)和“COLOR”(字节偏移量:12)的情况下:

D3D11_INPUT_ELEMENT_DESC 布局[] =
{
{ "位置", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "颜色", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};

但您也可以只选择“POSITION”(偏移量 0)和“NORMAL”(偏移量 28):

D3D11_INPUT_ELEMENT_DESC 布局[] =
{
{ "位置", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "正常" , 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
于 2012-08-30T12:12:05.907 回答