C DirectX 11从第二个顶点缓冲区呈现麻烦
C++ DirectX 11 Trouble Rendering from a second vertex buffer
我正在使用我的第一个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 ...(设置接地缓冲区,与方形缓冲区完全相同。我还将地面网格大大简化为一个正方形,以使您更容易看到发生的事情。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- OpenGL 16 位模板缓冲区?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 在 openGL 中多次绑定缓冲区
- C DirectX 11从第二个顶点缓冲区呈现麻烦
- 使用MQQueue将数据读取到缓冲区中时麻烦