C DirectX 11从第二个顶点缓冲区呈现麻烦

C++ DirectX 11 Trouble Rendering from a second vertex buffer

本文关键字:缓冲区 麻烦 顶点 第二个 DirectX      更新时间:2023-10-16

我正在使用我的第一个3D游戏引擎,并且我刚刚超越了"绘制彩虹立方体"阶段。我的下一步是能够画一个地面网。我想使用多个不同的顶点缓冲区来存储位置数据。我基本上复制了用于生成Cube的顶点和索引缓冲区的代码(只是更改了缓冲区/输入数据的名称(。然后,我更改了渲染函数,以获取一个源值,以说明要设置哪个缓冲区。当我第一次尝试时,旋转的立方体变成了巨大的毁灭形状。稍后再进行一些变化,现在我得到了我的立方体可以正确显示,但是地面无处可见。如果有人能给我一些关于我在这个难题中缺少的东西的见解,我将不胜感激。我找不到任何描述我问题的东西。

void DXDEngine::Render(UINT numIndices, XMMATRIX VPMat, XMMATRIX worldMat,  UINT source) //source: 1 = squareVertBuffer, 2 = ground buffer
{
//Called each frame to present the buffer
bool validSource = false;
UINT stride = sizeof(Vertex);
UINT offset = 0;
UINT stride2 = sizeof(Vertex);
UINT offset2 = 0;
switch (source)
{
case(1):
    //Set the cube vertex buffer
    devcon->IASetVertexBuffers(0, 1, &squareVertBuffer, &stride, &offset);
    devcon->IASetIndexBuffer(squareIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
    validSource = true;
    break;
case(2):
    //Set the vertex buffer
    devcon->IASetVertexBuffers(1, 0, &groundVertBuffer, &stride2, &offset2);
    devcon->IASetIndexBuffer(groundIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
    validSource = true;
    break;
default:
    validSource = false;
    break;
}
if (validSource == true)
{
    XMMATRIX WVPMat = worldMat * VPMat;
    //Insert the transpose of the world view projection matrix into the per object structure
    cbPerObj.WVP = XMMatrixTranspose(WVPMat);
    //pass the per object structure to the buffer
    devcon->UpdateSubresource(cbPerObjectBuffer, 0, NULL, &cbPerObj, 0, 0);
    //Update the vertex shader to use the constant buffer
    devcon->VSSetConstantBuffers(0, 1, &cbPerObjectBuffer);

    // do 3D rendering on the back buffer here
    devcon->DrawIndexed(numIndices, 0, 0);
}
}

平方缓冲区的初始化: d3d11_buffer_desc vertexbufferdesc; zeromemory(& vertexbufferdesc,sizeof(vertexbufferdesc((;

vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
vertexBufferDesc.ByteWidth = sizeof(Vertex) * vLen;
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vertexBufferDesc.CPUAccessFlags = 0;
vertexBufferDesc.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA vertexBufferData;
ZeroMemory(&vertexBufferData, sizeof(vertexBufferData));
vertexBufferData.pSysMem = v;
hr = dev->CreateBuffer(&vertexBufferDesc, &vertexBufferData, &squareVertBuffer);
//Set the vertex buffer
UINT stride = sizeof(Vertex);
UINT offset = 0;
devcon->IASetVertexBuffers(0, 1, &squareVertBuffer, &stride, &offset);
D3D11_BUFFER_DESC indexBufferDesc;
ZeroMemory(&indexBufferDesc, sizeof(indexBufferDesc));
indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
indexBufferDesc.ByteWidth = sizeof(DWORD) * indicesLen;
indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
indexBufferDesc.CPUAccessFlags = 0;
indexBufferDesc.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = indices;
dev->CreateBuffer(&indexBufferDesc, &iinitData, &squareIndexBuffer);
devcon->IASetIndexBuffer(squareIndexBuffer, DXGI_FORMAT_R32_UINT, 0);

和地面顶点缓冲区

D3D11_BUFFER_DESC gVertexBufferDesc;
ZeroMemory(&gVertexBufferDesc, sizeof(gVertexBufferDesc));
gVertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
gVertexBufferDesc.ByteWidth = sizeof(Vertex) * grndVertLen;
gVertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
gVertexBufferDesc.CPUAccessFlags = 0;
gVertexBufferDesc.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA gVertexBufferData;
ZeroMemory(&gVertexBufferData, sizeof(gVertexBufferData));
gVertexBufferData.pSysMem = grndVert;
hr = dev->CreateBuffer(&gVertexBufferDesc, &gVertexBufferData, &groundVertBuffer);
//Set the vertex buffer
UINT stride = sizeof(Vertex);
UINT offset = 0;
devcon->IASetVertexBuffers(1, 1, &groundVertBuffer, &stride, &offset);
D3D11_BUFFER_DESC gIndexBufferDesc;
ZeroMemory(&gIndexBufferDesc, sizeof(gIndexBufferDesc));
gIndexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
gIndexBufferDesc.ByteWidth = sizeof(DWORD) * indicesLen;
gIndexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
gIndexBufferDesc.CPUAccessFlags = 0;
gIndexBufferDesc.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = grndIndex;
dev->CreateBuffer(&gIndexBufferDesc, &iinitData, &groundIndexBuffer);
devcon->IASetIndexBuffer(groundIndexBuffer, DXGI_FORMAT_R32_UINT, 0);

在更多的玩具之后,我找到了两个原因。原因是每个人都喜欢的朋友,是对顶点的逆时针索引。我最终不得不使用IaSetVertexBuffer(0,1 ...(设置接地缓冲区,与方形缓冲区完全相同。我还将地面网格大大简化为一个正方形,以使您更容易看到发生的事情。