Direct3D多个顶点缓冲区,非交错元素

时间:2015-01-31 06:03:41

标签: c++ directx direct3d vertex vertex-buffer

我正在尝试创建2个顶点缓冲区,一个只存储位置,另一个只存储颜色。这只是Frank Luna的书中练习熟悉顶点描述,布局和缓冲选项的练习。问题是我觉得我做了所有相关的更改,虽然我要显示几何图形,但颜色缓冲区不起作用。要完成练习,不要使用本书的顶点顶点[] = {{...},{...},...},而不是每个顶点存储位置和颜色的示例代码,我使用的是XMFLOAT3 pos [] = {x,y,z ...}表示位置和XMFLOAT4颜色[] = {a,b,c,...}。我修改了顶点描述,使每个元素引用正确的输入点:

D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
    {
        {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
        {"COLOR",    0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}
    };

我还改变了设备上的顶点缓冲区,以期望两个顶点缓冲区而不仅仅是mBoxVB,而mBoxVB以前是基于顶点顶点的资源[]:

ID3D11Buffer* mBoxVB;
ID3D11Buffer* mBoxVBCol;
ID3D11Buffer* combined[2];
...
combined[0]=mBoxVB;
combined[1]=mBoxVBCol;
...
UINT stride[] = {sizeof(XMFLOAT3), sizeof(XMFLOAT4)};
UINT offset = 0;
md3dImmediateContext->IASetVertexBuffers(0, 2, combined, stride, &offset);

如果有任何帮助,这是缓冲区创建代码:

    D3D11_BUFFER_DESC vbd;
    vbd.Usage = D3D11_USAGE_IMMUTABLE;
    vbd.ByteWidth = sizeof(XMFLOAT3)*8;
    vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vbd.CPUAccessFlags = 0;
    vbd.MiscFlags = 0;
    vbd.StructureByteStride = 0;

    D3D11_SUBRESOURCE_DATA vinitData;
    vinitData.pSysMem = Shapes::boxEx1Pos;
    HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mBoxVB));

    D3D11_BUFFER_DESC cbd;
    vbd.Usage = D3D11_USAGE_IMMUTABLE;
    vbd.ByteWidth = sizeof(XMFLOAT4)*8;
    vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vbd.CPUAccessFlags = 0;
    vbd.MiscFlags = 0;
    vbd.StructureByteStride = 0;

    D3D11_SUBRESOURCE_DATA cinitData;
    cinitData.pSysMem = Shapes::boxEx1Col;
    HR(md3dDevice->CreateBuffer(&vbd, &cinitData, &mBoxVBCol));

如果我使用合并[0] = mBoxVBCol,而不是组合[0] = mBoxVB,我会得到一个不同的形状,所以我知道那里有一些数据,但我不知道为什么Color元素没有被发送到在顶点着色器中,我觉得在操作中忽略了第二个槽。

1 个答案:

答案 0 :(得分:1)

我找到了问题的答案。很简单,虽然我为两个缓冲区指定了步幅数组,但我只给出了一个偏移量,所以一旦我改变了UINT offset = 0;到UINT offset [] = {0,0};它奏效了。