简体   繁体   English

来自第二个顶点缓冲区的C ++ DirectX 11麻烦渲染

[英]C++ DirectX 11 Trouble Rendering from a second vertex buffer

I am working on my first 3D game engine and I'm just getting past the "draw a rainbow cube" stage. 我正在开发我的第一个3D游戏引擎,现在已经过了“绘制彩虹方块”阶段。 My next step is being able to draw a ground mesh. 我的下一步是能够绘制地面网格。 I'd like to use multiple different vertex buffers for storing position data. 我想使用多个不同的顶点缓冲区来存储位置数据。 I basically copied the code I used for generating the vertex and index buffers for the cube (just changed the names of the buffers/the input data). 我基本上复制了用于生成多维数据集的顶点和索引缓冲区的代码(只是更改了缓冲区/输入数据的名称)。 Then I changed my render function to take in a source value to tell it which buffer to set. 然后,我更改了render函数,以获取一个源值来告诉它要设置哪个缓冲区。 When I first tried it, my rotating cube turned into a gigantic horribly disfigured shape. 当我第一次尝试时,我旋转的立方体变成了巨大的可怕毁容形状。 A couple little changes later, and now I get my cube to show properly, but the ground is nowhere to be seen. 稍后进行了一些小的更改,现在我可以正确显示我的多维数据集,但是看不到地面。 If someone could give me some insight as to what I'm missing in this puzzle, I'd appreciate it. 如果有人可以让我对这个谜题中缺少的内容有所了解,我将不胜感激。 I couldn't find anything that quite described my issue. 我找不到任何能描述我的问题的东西。

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

}

initialization of square buffer: D3D11_BUFFER_DESC vertexBufferDesc; 方缓冲区的初始化:D3D11_BUFFER_DESC vertexBufferDesc; ZeroMemory(&vertexBufferDesc, sizeof(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);

and the ground vertex buffer 和地面顶点缓冲区

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

After some more toying around, I found two reasons why it wasn't working. 经过更多的玩弄之后,我发现了它不起作用的两个原因。 Reason one was everyone's favorite friend, proper counter-clockwise indexing of the vertices. 原因之一是每个人都喜欢的朋友,对顶点进行适当的逆时针索引。 I ended up having to set the ground buffer using IASetVertexBuffer(0,1...), exactly the same as for the square buffer. 我最终不得不使用IASetVertexBuffer(0,1 ...)来设置地面缓冲区,这与正方形缓冲区完全相同。 I also greatly simplified the ground mesh to a single square to make it easier to see what was happening. 我还极大地简化了地面网格,使其简化为一个正方形,从而更容易查看正在发生的情况。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM