我設法構建了運行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
成員函數,該程序生成一個運行時錯誤:
功能被稱爲:
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);
感謝您的調試建議,它進一步評估了爲什麼'D3D11CreateDeviceAndSwapChain()'失敗。原來,當我爲D3D和Win32創建兩個單獨的非繼承類時,只有Win32類存儲了正確的'HWND'成員。一個快速的解決方案是重寫'virtual void StartSwapChain(ID3D11DepthStencilView * DepthStenView);'接受'HWND'並用Engine.hWnd填充它,直到我重寫爲繼承。 (去做...) –