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

3

我正在尝试创建两个顶点缓冲区,一个仅存储位置,另一个仅存储颜色。这只是Frank Luna的书籍中的一个练习,旨在熟悉顶点描述、布局和缓冲区选项。问题是,虽然我能够显示几何体,但颜色缓冲区无法工作。为了完成这个练习,我使用了XMFLOAT3 pos[]={x,y,z...}来存储位置,以及XMFLOAT4 colors[]={a,b,c,...}来存储颜色,而不是使用书中的Vertex vertices[]={{...},{...},...},其中每个Vertex存储位置和颜色。我修改了顶点描述,使每个元素引用正确的输入位置:

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}
    };

我还将设备上的顶点缓冲区更改为期望两个顶点缓冲区,而不仅仅是以前基于Vertex vertices[]的资源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));

如果我使用combined[0]=mBoxVBCol而不是combined[0]=mBoxVB,就会得到不同的形状,所以我知道这里有一些数据,但我不确定为什么颜色元素没有传递到顶点着色器,看起来第二个插槽在操作中被忽略了。

你能同时发布你的着色器源代码吗? - undefined
抱歉耽搁了,但是当我使用一个顶点缓冲区时,着色器运行得很好。我找到了问题并已经发布了它。 - undefined
1个回答

2

我找到了解决问题的方法。问题在于尽管我为两个缓冲区都指定了步幅数组,但我只给了一个偏移量,所以一旦我将UINT offset=0;更改为UINT offset[]={0,0};,它就起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接