我设法构建了一个运行DirectX 11应用程序的工作基础。但是,在删除代码的同时,我注意到当一些COM指针被放置为基类的protected:
成员时,它们并没有像直觉那样运行。
在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,Viewport和Rendering。 (我为窗口创建了一个单独的[header]类,它成功地显示了窗口。)
已创建类的实例。
Infinity3D D3DSystem;
InfinityEngine Engine(hInstance);
当调用需要DirectX COM对象的D3DSystem.InitializeD3D()
或任何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);
答案 0 :(得分:1)
您的交换链是nullptr
,这就是您的GetBuffer呼叫失败的原因
这可能意味着您的初始化无法创建交换链。
所有D3D“创建”功能都会返回一个表示成功或失败的值,您应该检查它们 此外,您可以打开调试层,它将告诉您在VS'输出窗口中失败和可能的原因 您可以通过打开DirectX控制面板(dxcpl.exe),将程序的可执行文件名称添加到列表中,并将其设置为“强制打开”来完成此操作。