Мне удалось создать рабочую базу для запуска приложения 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, программа создает ошибку времени выполнения:
Функции называются:
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);
Ваш Swapchain является nullptr
, что почему ваш вызов GetBuffer терпит неудачу.
Вероятно, это означает, что вашей инициализации не удалось создать swapchain.
Все функции D3D "Создать" возвращают значение, указывающее на успех или неудачу, вы должны их проверить.
Кроме того, вы можете включить слой отладки, который расскажет вам, что не удалось, и, вероятно, почему в окне вывода VS.
Вы можете сделать это, открыв панель управления DirectX (dxcpl.exe), добавив в список исполняемое имя вашей программы и установив для него значение "Принудительное включение".
D3D11CreateDeviceAndSwapChain()
не работает. Оказывается, когда я создал два отдельных не наследующих класса для D3D и Win32, только класс Win32 сохранил правильный членHWND
. Быстрое решение состояло в том, чтобы переписатьvirtual void StartSwapChain(ID3D11DepthStencilView *DepthStenView);
взять вHWND
и заполнить его Engine.hWnd, пока я не перепишу для наследования. (СДЕЛАТЬ...)