1

2Dの正方形を重ねて描画しようとしています。

最初の正方形は800x600ピクセルで、中心は0、0です。2番目の正方形のセットはそれぞれ30 x 30ピクセルで、最初の2D正方形の上を移動します。

最初の正方形では、単純なインデックス付きジオメトリを使用してレンダリングしようとしています。

それぞれを個別にレンダリングしてみましたが、機能します。しかし、両方を同時にレンダリングしようとすると、最初に最初の正方形をレンダリングしても、2番目の正方形のインスタンス化は、800 x 600の正方形をシフトして、小さい方のインスタンスバッファーの最初のインスタンスに一致させることによって干渉するようです。ボードから各正方形に切り替えるときに新しい頂点バッファーを渡しますが、正方形。以下は私のレンダリングコードです:

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

私は根本的に間違ったことをしていますか?ボードは800x600の正方形で、ブロックは30x30の正方形です。ボードの上に、基本的に複数の正方形をレンダリングしたいと思います。

4

1 に答える 1

0

2 番目の頂点バッファーの入力レイアウトを設定していません。m_d3dBoardVBuffer をレンダリングする前に設定しますが、vBuffers をレンダリングする前に一意のものを設定しません。

于 2013-02-25T02:34:47.980 に答える