2011-09-06 34 views
4

我一直在關注一本關於使用D3D11進行遊戲編程的基礎知識的書。我現在瞭解Direct3D的絕對基礎知識:)Direct3D11(C++):渲染(基本)問題

但是...我有一個問題。在書中,我總是不得不一次做一個演示。現在,我正在試圖製作一款2D遊戲。由於我不想習慣壞習慣,所以我需要你的建議。在書中,我總是必須定義一個(帶有texcoord和位置成員的結構VertexPos)或(僅帶有XMFLOAT3位置成員的結構VertexPos)。在我製作的遊戲中,我希望能夠繪製沒有紋理和表面紋理的實體曲面。我不知道如何做到這一點,更不用說高效地做到這一點。

這裏是我的渲染功能:

void GameSpriteDemo::Render() 
{ 
    if (m_pD3DContext == 0) 
    {return;} 

    float ClearColor[4] = {0.0f, 0.0f, 0.25f, 1.0f}; 
    m_pD3DContext->ClearRenderTargetView(m_pBackBufferTarget,ClearColor); 

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

    m_pD3DContext->IASetInputLayout(m_pInputLayout); 
    m_pD3DContext->IASetVertexBuffers(0,1,&m_pVertexBuffer, &stride, &offset); 
    m_pD3DContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 

    m_pD3DContext->VSSetShader(m_pSolidColorVS,0,0); 
    m_pD3DContext->PSSetShader(m_pSolidColorPS,0,0); 
    m_pD3DContext->PSSetShaderResources(0,1,&m_pColorMap); 
    m_pD3DContext->PSSetSamplers(0,1,&m_pColorMapSampler); 

    for(int i=0; i < 2; ++i) 
    { 
     XMMATRIX world = m_Sprites[i].GetWorldMatrix(); 
     XMMATRIX mvp = XMMatrixMultiply(world, m_VpMatrix); 
     mvp = XMMatrixTranspose(mvp); 

     m_pD3DContext->UpdateSubresource(m_pMvpCB,0,0,&mvp,0,0); 
     m_pD3DContext->VSSetConstantBuffers(0,1,&m_pMvpCB); 

     m_pD3DContext->Draw(6,0); 
    } 

    m_pSwapChain->Present(0,0); 
} 

那麼,應該如何有效地我與多個頂點緩衝區,輸入的佈局,着色器,攪拌機等處理呢?

我應該只是創建這些的多個版本,然後在繪製調用後設置重置輸入裝配,着色器等?或者這不起作用/這是不是有效?

謝謝:)

+0

如何使用框架? – Dani

+0

我想學習如何從開始做到這一點...會教我很多 – xcrypt

回答

4

簡單的答案是肯定的,你應該創建多個頂點緩衝區,輸入的佈局,着色器等,每個相應的繪圖調用之前設置適當的。這將工作並且相當高效(對於現代硬件上的2D遊戲應該足夠高效)。

在完整的3D遊戲引擎中,事情往往會變得複雜一些。通常,渲染引擎會在頂點和索引緩衝區,輸入佈局,着色器等基本對象之上分層添加一些內部抽象層。

構造事物的一個相當常見的簡單方法是擁有一個Mesh類,它知道關於所有頂點緩衝區,索引緩衝區,輸入佈局,着色器,紋理等,它們組成了一個3D模型的一部分,可以在一次繪製調用中繪製,並負責將它們全部設置(通常與其他位一起渲染狀態如混合模式,剔除模式等)併發出相應的繪製調用。

沒有與改變任何設備狀態等渲染引擎通常是爲了嘗試和排序都需要在特定幀繪製,以儘量減少所需的狀態變化數量的對象相關的成本。例如,在「戰爭黎明2」渲染器中,我們對所有網格幾何進行了排序,以便我們可以繪製例如在繪製具有不同頂點和索引緩衝區,紋理等的所有空間海洋體之前,需要具有最小狀態改變的所有空間海洋頭盔。

現代3D硬件和API比過去改變狀態的開銷少一些所以排序以最大限度地減少狀態變化的重要性不如以前那麼重要,但對於需要在PC上獲得最大性能的遊戲,這仍然是常見做法。

在數據驅動的渲染引擎中,支持靈活的照明和材質模型以及蒙皮動畫,地形,粒子系統,全屏幕效果,2D UI等等,這是一個合適的設計,用於管理繪製所需的所有狀態遊戲對象並對其進行排序以便能夠以最大效率進行繪製可能會變得相當複雜,並且有許多不同的方法來構造事物。所有可歸類爲「渲染器狀態管理」的代碼通常構成典型渲染引擎中的大部分代碼。