2014-01-28 63 views
0

我設法構建了運行DirectX 11應用程序的工作基礎。然而,在封裝代碼的同時,我注意到一些COM指針在被作爲基類的protected:成員放置時沒有按照直覺期望運行。DirectX11:從類成員函數初始化DirectX時出現運行時錯誤

在Engine.h(標題)

class Infinity3D{ 
public: 
    Infinity3D(); 
    ~Infinity3D(); 

    virtual void Render(); 
    virtual void Update(); 
    virtual void D3DProcess(); 
    virtual void ViewPort(UINT Height, UINT Width, float MaxDepth, float MinDepth, int  TopLeftX, int TopLeftY); 
    virtual void StartSwapChain(ID3D11DepthStencilView *DepthStenView); 
    virtual void InitializeD3D(); 
    virtual void TerminateD3D(); 
    virtual void InitializeShader(); 

protected: 
    IDXGISwapChain*     Swapchain; 
    ID3D11Device*     Device; 
    ID3D11DeviceContext*    DeviceContext; 
    ID3D11RenderTargetView*   RenderTargetView; 
    IDXGIAdapter*     DeviceAdapter; 

    ID3D11InputLayout*    InputLayout; 
    ID3D11VertexShader*    VertexShader; 
    ID3D11PixelShader*    PixelShader; 

    ID3D11Buffer*     D3DBuffer; 
    ID3D11Buffer*     D3DIndexBuffer; 

    ID3D11DepthStencilView*   DepthStenView; 
    ID3D11Texture2D*     DepthStenBuffer; 

    ID3D11Buffer*     MatrixBuffer; 

    XMMATRIX      mWorld; 
    XMMATRIX      mView; 
    XMMATRIX      mProjection; 
    XMMATRIX      mWVP; 
    HWND       hWnd; 
    UINT cWidth; 
    UINT cHeight; 
}; 

作爲測試,我跑的DirectX僅初始化的基本功能:SwapChain,視口,和渲染。 (我有一個窗口創建的單獨[header]類,它顯示窗口成功。)

類的實例已創建。

Infinity3D D3DSystem; 
InfinityEngine Engine(hInstance); 

當調用D3DSystem.InitializeD3D(),或者需要一個DirectX COM對象的任何Infinity3D成員函數,該程序生成一個運行時錯誤:

VS 2012 runtime error

功能被稱爲:

int InfinityEngine::Process(){ 
    while(WM_QUIT != msg.message){ 
    if(PeekMessage(&msg, NULL, 0,0, PM_REMOVE)){ 
           TranslateMessage(&msg); 
           DispatchMessage(&msg); 
          } 
          else{ 
           D3DSystem.Update(); 
           D3DSystem.Render(); 
          } 
         } 
D3DSystem.TerminateD3D(); 
return msg.wParam; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpCmdLine, int nCmdShow){ 
    if(Engine.DisplayWindow()){D3DSystem.InitializeD3D();Engine.Process();} 
} 

爲了空間的緣故,我將在InitializeD3D類中展示COM指針的用法這是在實例化DXGI_SWAP_CHAIN_DESC之後並調用D3D11CreateDeviceAndSwapChain()

Swapchain->GetBuffer(0,__uuidof(ID3D11Texture2D),(LPVOID*)&Texture2d); 

回答

1

你的Swapchain是nullptr,這就是爲什麼你的GetBuffer調用失敗。
這可能意味着您的初始化無法創建交換鏈。

所有的D3D「創建」函數都會返回一個表示成功或失敗的值,您應該檢查這些值。
此外,你可以打開調試層,它會告訴你什麼失敗,可能是爲什麼在VS的輸出窗口。
您可以通過打開DirectX控制面板(dxcpl.exe),將程序的可執行名稱添加到列表中,並將其設置爲「強制啓用」來完成此操作。

+0

感謝您的調試建議,它進一步評估了爲什麼'D3D11CreateDeviceAndSwapChain()'失敗。原來,當我爲D3D和Win32創建兩個單獨的非繼承類時,只有Win32類存儲了正確的'HWND'成員。一個快速的解決方案是重寫'virtual void StartSwapChain(ID3D11DepthStencilView * DepthStenView);'接受'HWND'並用Engine.hWnd填充它,直到我重寫爲繼承。 (去做...) –