Direct3D 多顶点缓冲区,非交错元素
Direct3D multiple vertex buffers, non interleaved elements
我正在尝试创建 2 个顶点缓冲区,一个只存储位置,另一个只存储颜色。这只是 Frank Luna 书中的练习,用于熟悉顶点描述、布局和缓冲区选项。问题是我觉得我已经做了所有相关的更改,虽然我正在显示几何图形,但颜色缓冲区不起作用。为了完成练习,我没有使用书中的 Vertex vertices[]={{...},{...},...} 来自每个 Vertex 存储位置和颜色的示例代码,而是使用 XMFLOAT3 pos[]={x,y,z...} 对于位置和 XMFLOAT4 colors[]={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,后者以前是基于顶点顶点的资源[]:
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,我会得到一个不同的形状,所以我知道那里有一些数据,但我不确定为什么 Color 元素没有被发送通过顶点着色器,在我看来,第二个插槽在操作中被忽略了。
我找到了问题的答案。很简单,虽然我为两个缓冲区都指定了步幅数组,但我只给出了一个偏移量,所以一旦我更改了 UINT offset=0;到 UINT 偏移量[]={0,0};成功了。
我正在尝试创建 2 个顶点缓冲区,一个只存储位置,另一个只存储颜色。这只是 Frank Luna 书中的练习,用于熟悉顶点描述、布局和缓冲区选项。问题是我觉得我已经做了所有相关的更改,虽然我正在显示几何图形,但颜色缓冲区不起作用。为了完成练习,我没有使用书中的 Vertex vertices[]={{...},{...},...} 来自每个 Vertex 存储位置和颜色的示例代码,而是使用 XMFLOAT3 pos[]={x,y,z...} 对于位置和 XMFLOAT4 colors[]={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,后者以前是基于顶点顶点的资源[]:
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,我会得到一个不同的形状,所以我知道那里有一些数据,但我不确定为什么 Color 元素没有被发送通过顶点着色器,在我看来,第二个插槽在操作中被忽略了。
我找到了问题的答案。很简单,虽然我为两个缓冲区都指定了步幅数组,但我只给出了一个偏移量,所以一旦我更改了 UINT offset=0;到 UINT 偏移量[]={0,0};成功了。