1

DirectX 12 をいじっていて、「チェッカー ボード」を描こうとして壁にぶつかりました。ネットをかなり検索したので、ヘルプ/ポインターをいただければ幸いです。

D3D11 での作業コードは次のとおりです。

auto context = m_deviceResources->GetD3DDeviceContext();

for (int i = -10; i < 10; i++)
{
    for (int j = -10; j < 10; j++)
    {
        // perform translation
        XMStoreFloat4x4(&m_constantBufferData.model, XMMatrixTranspose(XMMatrixTranslation(i, j, 0.0f)));
        context->UpdateSubresource(
            m_constantBuffer.Get(),
            0,
            NULL,
            &m_constantBufferData,
            0,
            0
            );

        // shaders, etc...

        // draw the square
        context->DrawIndexed(
            m_indexCount,
            0,
            0
            );
    }
}

D3D12 で同じことを試みましたが、すべての正方形が同じ場所にあるため、翻訳がグローバルに実行されているようです。

bool Sample3DSceneRenderer::Render()
{
    if (!m_loadingComplete)
    {
        return false;
    }

    DX::ThrowIfFailed(m_deviceResources->GetCommandAllocator()->Reset());

    DX::ThrowIfFailed(m_commandList->Reset(m_deviceResources->GetCommandAllocator(), m_pipelineState.Get()));


    PIXBeginEvent(m_commandList.Get(), 0, L"Draw the objects");
    {
        m_commandList->SetGraphicsRootSignature(m_rootSignature.Get());
        ID3D12DescriptorHeap* ppHeaps[] = { m_cbvHeap.Get() };
        m_commandList->SetDescriptorHeaps(_countof(ppHeaps), ppHeaps);

        CD3DX12_GPU_DESCRIPTOR_HANDLE gpuHandle(m_cbvHeap->GetGPUDescriptorHandleForHeapStart(), m_deviceResources->GetCurrentFrameIndex(), m_cbvDescriptorSize);
        m_commandList->SetGraphicsRootDescriptorTable(0, gpuHandle);

        D3D12_VIEWPORT viewport = m_deviceResources->GetScreenViewport();
        m_commandList->RSSetViewports(1, &viewport);
        m_commandList->RSSetScissorRects(1, &m_scissorRect);

        CD3DX12_RESOURCE_BARRIER renderTargetResourceBarrier =
            CD3DX12_RESOURCE_BARRIER::Transition(m_deviceResources->GetRenderTarget(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET);
        m_commandList->ResourceBarrier(1, &renderTargetResourceBarrier);

        D3D12_CPU_DESCRIPTOR_HANDLE renderTargetView = m_deviceResources->GetRenderTargetView();
        D3D12_CPU_DESCRIPTOR_HANDLE depthStencilView = m_deviceResources->GetDepthStencilView();
        m_commandList->ClearRenderTargetView(renderTargetView, m_colors.Get_background(), 0, nullptr);
        m_commandList->ClearDepthStencilView(depthStencilView, D3D12_CLEAR_FLAG_DEPTH, 1.0f, 0, 0, nullptr);


        m_commandList->OMSetRenderTargets(1, &renderTargetView, false, &depthStencilView);

        m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
        m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
        m_commandList->IASetIndexBuffer(&m_indexBufferView);


        for (float i = -10.0f; i < 10.0f; i++)
        {
            for (float j = -10.0f; j < 10.0f; j++)
            {
                // as far as I know, this is how I should perform the translation
                XMStoreFloat4x4(&m_constantBufferData.model, XMMatrixTranspose(XMMatrixTranslation(i, j, 0.0f)));

                UINT8* destination = m_mappedConstantBuffer + (m_deviceResources->GetCurrentFrameIndex() * c_alignedConstantBufferSize);
                memcpy(destination, &m_constantBufferData, sizeof(m_constantBufferData));

                m_commandList->DrawIndexedInstanced(6, 1, 0, 0, 0);
            }
        }

        CD3DX12_RESOURCE_BARRIER presentResourceBarrier =
            CD3DX12_RESOURCE_BARRIER::Transition(m_deviceResources->GetRenderTarget(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT);
        m_commandList->ResourceBarrier(1, &presentResourceBarrier);
    }
    PIXEndEvent(m_commandList.Get());

    DX::ThrowIfFailed(m_commandList->Close());

    ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() };
    m_deviceResources->GetCommandQueue()->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists);

    return true;
}

ありがとう、チェルシー

4

1 に答える 1