DirectX 11:从类成员函数初始化DirectX时出现运行时错误

时间:2014-01-28 18:48:08

标签: c++ class pointers runtime directx-11

我设法构建了一个运行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成员函数时,程序会产生运行时错误:

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 个答案:

答案 0 :(得分:1)

您的交换链是nullptr,这就是您的GetBuffer呼叫失败的原因 这可能意味着您的初始化无法创建交换链。

所有D3D“创建”功能都会返回一个表示成功或失败的值,您应该检查它们 此外,您可以打开调试层,它将告诉您在VS'输出窗口中失败和可能的原因 您可以通过打开DirectX控制面板(dxcpl.exe),将程序的可执行文件名称添加到列表中,并将其设置为“强制打开”来完成此操作。