2015-12-27 6 views
1

Я возился с DirectX 12 и ударил стену, пытаясь нарисовать «контрольную панель». Я немного искал сеть, поэтому любая помощь/указатели будут оценены.Нарисуйте несколько объектов в D3D12

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

Спасибо, Chelsey

ответ

2

Вы просто пишете матрицу перевода в ту же самую часть памяти для каждой копии модели. Поскольку GPU даже не начал рисовать первую модель к тому времени, когда вы закончили писать матрицу перевода для последней, единственное место, которое любая из этих моделей собирается нарисовать, находится на месте последней написанной матрицы перевода.

Вам необходимо написать каждую матрицу в отдельном отдельном месте в памяти и убедиться, что они не перезаписаны ничем другим, пока графический процессор не завершит рисование моделей.

Акт вызова DrawIndexedInstanced не дает указания графическому процессору, чтобы он ничего рисовал, он просто добавляет команду в список команд для рисования объекта в будущем. Если вы не знакомы с асинхронным характером графических интерфейсов API и выполнением графического процессора, вам, вероятно, стоит немного поработать над тем, как он работает.

 Смежные вопросы

  • Нет связанных вопросов^_^