SwapChain wird nicht erzeugt
-
Hallo Leute,
mein Programm unterbricht, da es auf einen ungültigen Zeiger verweist.
Aber ich erzeuge doch den Swapchain.#include <Windows.h> #include <WindowsX.h> #include <d3d11.h> #include <d3dx10.h> #include <d3dx11.h> #pragma comment (lib, "d3d11.lib") #pragma comment (lib, "d3dx10.lib") #pragma comment (lib, "d3dx11.lib") // Defines #define SCREEN_WIDTH 1280 #define SCREEN_HEIGHT 720 // Globals IDXGISwapChain *swapchain; ID3D11Device *dev; ID3D11DeviceContext *devcon; ID3D11RenderTargetView *backbuffer; // Prototypes LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void InitD3D(HWND hWnd); void CleanD3D(); // Main int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { HWND hWnd; WNDCLASSEX WndClassEx; ZeroMemory(&WndClassEx, sizeof(WNDCLASSEX)); WndClassEx.cbSize = sizeof(WNDCLASSEX); WndClassEx.style = CS_HREDRAW | CS_VREDRAW; WndClassEx.lpfnWndProc = WindowProc; WndClassEx.hInstance = hInstance; WndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW); WndClassEx.hbrBackground = (HBRUSH)COLOR_WINDOW; WndClassEx.lpszClassName = "WindowClass"; RegisterClassEx(&WndClassEx); RECT wr = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); hWnd = CreateWindowEx(NULL, "WindowClass", "Programm", WS_OVERLAPPEDWINDOW, 300, 175, wr.right - wr.left, wr.bottom - wr.top, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); InitD3D(hWnd); MSG msg; while (TRUE) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); if (msg.message == WM_QUIT) { break; } } } return msg.wParam; } // Methods LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); } void InitD3D(HWND hWnd) { DXGI_SWAP_CHAIN_DESC scd; ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC)); scd.BufferCount = 1; scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; scd.BufferDesc.Width = SCREEN_WIDTH; scd.BufferDesc.Height = SCREEN_HEIGHT; scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; scd.OutputWindow = hWnd; scd.SampleDesc.Count = 4; scd.Windowed = TRUE; D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL, D3D11_SDK_VERSION, &scd, &swapchain, &dev, NULL, &devcon); ID3D11Texture2D *pBackBuffer; swapchain -> GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID *) &pBackBuffer); // Das ist der ungültige Zeiger dev -> CreateRenderTargetView(pBackBuffer, NULL, &backbuffer); pBackBuffer -> Release(); devcon -> OMSetRenderTargets(1, &backbuffer, NULL); D3D11_VIEWPORT viewport; ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT)); viewport.TopLeftX = 0; viewport.TopLeftY = 0; viewport.Width = SCREEN_WIDTH; viewport.Height = SCREEN_HEIGHT; devcon -> RSSetViewports(1, &viewport); } void CleanD3D() { swapchain -> Release(); backbuffer -> Release(); dev -> Release(); devcon -> Release(); }
Hat jemand eine Idee?
-
Bist du dir sicher, dass dein D3D im Debug ist und keinen Fehler ausgibt?
-
Ja, beim Compilieren kommt kein Fehler, obwohl ich diese Funktion aufrufe:
D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL, D3D11_SDK_VERSION, &scd, &swapchain, &dev, NULL, &devcon);
Im Debugger steht, dass dev und swapchain 0x00000000 sind.
-
@Vyax
Er meint du sollst die Debug-Features der D3D Runtime aufdrehen - wobei ich nicht weiss wie das bei D3D11 geht, aber das sollte sich leicht ergoogeln lassen.
Mit dem Kompilieren hat das nichts zu tun.Und: Fehlercodes checken tut nicht weh, und so ganz manchmal hilft es einem auch weiter die Ursache des Fehlers zu finden.
AlsoHRESULT hrCreate = D3D11CreateDeviceAndSwapChain(...); if (FAILED(hrCreate)) { TRACE(_T("D3D11CreateDeviceAndSwapChain failed: error code 0x%08x\n"), hr); exit(1); // bzw. was auch immer }