DirectX11: ошибка времени выполнения при инициализации DirectX из функций-членов класса

0

Мне удалось создать рабочую базу для запуска приложения 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);

При вызове D3DSystem.InitializeD3D() или любой функции члена Infinity3D которой требуется объект DirectX COM, программа создает ошибку времени выполнения:

Изображение 174551

Функции называются:

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();}
}

Ради пространства, я покажу только использование COM - указателей в пределах member.This класса InitializeD3D после DXGI_SWAP_CHAIN_DESC конкретизируется и D3D11CreateDeviceAndSwapChain() называется.

Swapchain->GetBuffer(0,__uuidof(ID3D11Texture2D),(LPVOID*)&Texture2d);
Теги:
class
pointers
runtime
directx-11

1 ответ

1
Лучший ответ

Ваш Swapchain является nullptr, что почему ваш вызов GetBuffer терпит неудачу.
Вероятно, это означает, что вашей инициализации не удалось создать swapchain.

Все функции D3D "Создать" возвращают значение, указывающее на успех или неудачу, вы должны их проверить.
Кроме того, вы можете включить слой отладки, который расскажет вам, что не удалось, и, вероятно, почему в окне вывода VS.
Вы можете сделать это, открыв панель управления DirectX (dxcpl.exe), добавив в список исполняемое имя вашей программы и установив для него значение "Принудительное включение".

  • 0
    Спасибо за советы по отладке, это привело к дальнейшей оценке того, почему D3D11CreateDeviceAndSwapChain() не работает. Оказывается, когда я создал два отдельных не наследующих класса для D3D и Win32, только класс Win32 сохранил правильный член HWND . Быстрое решение состояло в том, чтобы переписать virtual void StartSwapChain(ID3D11DepthStencilView *DepthStenView); взять в HWND и заполнить его Engine.hWnd, пока я не перепишу для наследования. (СДЕЛАТЬ...)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню