2014-01-28 38 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填充它,直到我重写为继承。 (去做...) –