c++ - DrawIndexedInstanced() 影响其他几何体

标签 c++ directx directx-11

我正在尝试绘制一些彼此重叠的 2D 正方形。

第一个正方形为 800 x 600 像素,以 0, 0 为中心 第二组正方形各为 30 x 30 像素,在第一个二维正方形的顶部四处移动

对于第一个正方形,我尝试使用简单的索引几何体来渲染它。

我已经尝试过分别渲染每一个,并且它有效。但是,当我尝试同时渲染两者时,即使我首先渲染第一个方 block ,第二个方 block 的实例化似乎会干扰,因为移动 800 x 600 方 block 以匹配实例缓冲区中较小的第一个实例正方形,即使我在从棋盘切换到每个正方形时传递了新的顶点缓冲区。下面是我的渲染代码:

void Render()
{
    FLOAT color[] = {0.3f, 0.4f, 0.5f, 1.0f};

    m_d3dImmediateContext->ClearRenderTargetView(m_d3dRenderTargetView, color);
    m_d3dImmediateContext->ClearDepthStencilView(m_d3dDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

    m_d3dImmediateContext->IASetInputLayout(m_d3dInputLayout);
    m_d3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    UINT stride = sizeof(Vertex);
    UINT offset = 0;

    m_d3dImmediateContext->IASetVertexBuffers(0, 1, &m_d3dBoardVBuffer, &stride, &offset);
    m_d3dImmediateContext->IASetIndexBuffer(m_d3dIBuffer, DXGI_FORMAT_R32_UINT, 0);

    m_d3dImmediateContext->VSSetShader(m_d3dVShader, NULL, 0);
    m_d3dImmediateContext->PSSetShader(m_d3dPShader, NULL, 0);

    m_d3dImmediateContext->VSSetConstantBuffers(0, 1, &m_d3dCBPerObject);

    m_d3dImmediateContext->PSSetSamplers(0, 1, &m_samLinear);
    m_d3dImmediateContext->PSSetShaderResources(0, 1, &m_d3dBoardSRV);

    XMMATRIX worldViewProj = m_world * m_view * m_proj;
    XMStoreFloat4x4(&m_cbPerObject.WorldViewProj, worldViewProj);

    D3D11_MAPPED_SUBRESOURCE mappedResource;
    m_d3dImmediateContext->Map(m_d3dCBPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
    CopyMemory(mappedResource.pData, &m_cbPerObject, sizeof(struct CBPerObject));
    m_d3dImmediateContext->Unmap(m_d3dCBPerObject, 0);

    m_d3dImmediateContext->DrawIndexed(m_indexCount, 0, 0);

    UINT blockStride[2] = {sizeof(Vertex), sizeof(Instance)};
    UINT blockOffset[2] = {0, 0};

    ID3D11Buffer *vBuffers[2] = {m_d3dBlockVBuffer, m_d3dBlockInstVBuffer};

    m_d3dImmediateContext->IASetVertexBuffers(0, 2, vBuffers, blockStride, blockOffset);
    m_d3dImmediateContext->IASetIndexBuffer(m_d3dIBuffer, DXGI_FORMAT_R32_UINT, 0);

    m_d3dImmediateContext->VSSetShader(m_d3dVShader, NULL, 0);
    m_d3dImmediateContext->PSSetShader(m_d3dPShader, NULL, 0);

    m_d3dImmediateContext->VSSetConstantBuffers(0, 1, &m_d3dCBPerObject);

    m_d3dImmediateContext->PSSetSamplers(0, 1, &m_samLinear);
    m_d3dImmediateContext->PSSetShaderResources(0, 1, &m_d3dBlockSRV);

    worldViewProj = m_world * m_view * m_proj;
    XMStoreFloat4x4(&m_cbPerObject.WorldViewProj, worldViewProj);

    D3D11_MAPPED_SUBRESOURCE mappedResource2;
    m_d3dImmediateContext->Map(m_d3dCBPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource2);
    CopyMemory(mappedResource2.pData, &m_cbPerObject, sizeof(struct CBPerObject));
    m_d3dImmediateContext->Unmap(m_d3dCBPerObject, 0);

    m_d3dImmediateContext->DrawIndexedInstanced(m_indexCount, 4, 0, 0, 0);

    m_d3dSwapChain->Present(0, 0);
}

我做的事情根本上是错误的吗?棋盘是 800 x 600 的正方形,积木是 30 x 30 的正方形。在板的顶部,我想基本上渲染多个正方形。

最佳答案

您没有为第二个顶点缓冲区设置输入布局。您在渲染 m_d3dBoardVBuffer 之前设置它,但在渲染 vBuffers 之前不设置唯一的。

关于c++ - DrawIndexedInstanced() 影响其他几何体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15058143/

相关文章:

java - oop 中的接口(interface), "java-like"和 "c++-like"

c++ - 定义用于 volatile 和非 volatile 对象的例程

c++ - boost::asio 在线程中启动不同的服务?

c# - Monogame 音效无法播放

c++ - 将 Qt 与 DirectX 一起使用?

c++ - 将变量移动到头文件时出现运行时错误

c++ - 如何找到我的 C++ 类的实际大小?

c++ - 尝试创建直接 x 11 窗口时出现链接器错误

c++ - DirectX 11 多常量缓冲区

c++ - 在 Directx 中围绕特定半径的固定点旋转点?