我设法构建了运行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填充它,直到我重写为继承。 (去做...) –