Unbehandelte Ausnahme???
-
Hi Leute
Wenn ich diesen:#include <D3D11.h> #include <D3DX11.h> #include <D3DX10.h> #include <Windows.h> #include <WindowsX.h> #define SCREEN_WIDTH 1920 #define SCREEN_HEIGHT 1080 #pragma comment (lib, "d3d11.lib") #pragma comment (lib, "d3dx11.lib") #pragma comment (lib, "d3dx10.lib") #define SCREEN_WIDTH 1920 #define SCREEN_HEIGHT 1080 //----------------------------- //Globale //----------------------------- IDXGISwapChain *SwapChain; ID3D11Device *d3dDevice; ID3D11DeviceContext *devcon; ID3D11RenderTargetView *backbuffer; ID3D11InputLayout *pLayout; ID3D11VertexShader *pVS; ID3D11PixelShader *pPS; ID3D11Buffer *pVBuffer; struct VERTEX{FLOAT X, Y, Z; D3DXCOLOR Color;}; //----------------------------- //Prototypen //----------------------------- void InitD3D(HWND hWnd); //initialisiert Direct3D void CleanD3D(void); //schließt Direct3D und gibt den Speicher frei void Render(void); void InitPipeline(void); void InitGraphics(void); LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); //Zum Epfangen der Eingaben des Benutzers int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { HWND hWnd; WNDCLASSEX winClass; MSG uMsg; memset(&uMsg,0,sizeof(uMsg)); winClass.lpszClassName = "Final Times"; winClass.cbSize = sizeof(WNDCLASSEX); winClass.style = CS_HREDRAW | CS_VREDRAW; winClass.lpfnWndProc = NULL; winClass.hInstance = hInstance; winClass.hIcon = LoadIcon(hInstance,(LPCSTR)IDI_APPLICATION); winClass.hIconSm = LoadIcon(NULL,(LPCSTR)IDC_ARROW); winClass.hCursor = LoadCursor(NULL,IDC_ARROW); winClass.hbrBackground =(HBRUSH)GetStockObject(BLACK_BRUSH); winClass.lpszMenuName = NULL; winClass.cbClsExtra = 0; winClass.cbWndExtra = 0; RegisterClassEx(&winClass); hWnd = CreateWindowEx(NULL, "WND_CLASS_1", "Final Times", WS_OVERLAPPEDWINDOW, 1920, 1080, 0, 0, NULL, NULL, hInstance, NULL); ShowWindow(hWnd,nCmdShow); InitD3D(hWnd); while(TRUE) { if(PeekMessage(&uMsg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&uMsg); DispatchMessage(&uMsg); if(uMsg.message == WM_QUIT) break; } Render(); } // clean up DirectX and COM CleanD3D(); return uMsg.wParam; }; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_DESTROY: { PostQuitMessage(0); return 0; } break; } return DefWindowProc (hWnd, message, wParam, lParam); } //----------------------------- //initialisiert D3D(init.h) //----------------------------- 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; scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL, D3D11_SDK_VERSION, &scd, &SwapChain, &d3dDevice, NULL, &devcon); ID3D11Texture2D *pBackBuffer; SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer); d3dDevice->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); InitPipeline(); InitGraphics(); } void Render(void) { devcon->ClearRenderTargetView(backbuffer,D3DXCOLOR(1.0f,1.0f,1.0f,1.0f)); UINT stride = sizeof(VERTEX); UINT offset = 0; devcon->IAGetVertexBuffers(0,1, &pVBuffer,&stride,&offset); devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); devcon->Draw(3,0); //3DRENDERING HIER!!! SwapChain->Present(0,0); } void CleanD3D() { //Schließt und released alle COM-Objekte pLayout->Release(); pVS->Release(); pPS->Release(); pVBuffer->Release(); SwapChain->Release(); backbuffer->Release(); d3dDevice->Release(); devcon->Release(); } void InitGraphics(void) { VERTEX OurVertices[] = { {0.0f, 0.5f, 0.0f, D3DXCOLOR(1.0f, 0.0f, 1.0f, 1.0f)}, {0.45f, -0.5, 0.0f, D3DXCOLOR(1.0f, 1.0f, 0.0f, 1.0f)}, {-0.45f, -0.5f, 0.0f, D3DXCOLOR(0.0f, 1.0f, 1.0f, 1.0f)} }; D3D11_BUFFER_DESC BufferDesc; ZeroMemory(&BufferDesc,sizeof(BufferDesc)); BufferDesc.Usage = D3D11_USAGE_DYNAMIC; BufferDesc.ByteWidth = sizeof(VERTEX) * 3; BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; BufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; d3dDevice->CreateBuffer(&BufferDesc,NULL,&pVBuffer); D3D11_MAPPED_SUBRESOURCE MappedRessource; devcon->Map(pVBuffer,NULL,D3D11_MAP_WRITE_DISCARD,NULL,&MappedRessource); memcpy(MappedRessource.pData,OurVertices,sizeof(OurVertices)); devcon->Unmap(pVBuffer,NULL); } void InitPipeline() { ID3D10Blob *VS, *PS; D3DX11CompileFromFile("shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, 0, 0); D3DX11CompileFromFile("shaders.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, 0, 0); d3dDevice->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS); d3dDevice->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS); devcon->VSSetShader(pVS,0,0); devcon->PSSetShader(pPS,0,0); D3D11_INPUT_ELEMENT_DESC ied[] = { {"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0}, {"COLOR",0,DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA,0}, }; d3dDevice->CreateInputLayout(ied,2,VS->GetBufferPointer(),VS->GetBufferSize(),&pLayout); devcon->IASetInputLayout(pLayout); }
Übungscode compiliere Krige ich diese:
Unbehandelte Ausnahme bei 0x00c51831 in Final Times.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.Fehlermeldung.
Ich habe keine Ahnung woran das liegen könnte.
Ist einer meine ersten Quellcodes und soll Basis für weitere Übungen sein,deshlb die Kommentare.Vielen Dank für Hilfe.
-
Und wo genau tritt diese Ausnahme auf? Ich vermute mal es liegt dran dass deine SwapChain oder dein Device aufgrund falscher Flags nicht erstellt werden kann und es es dann natürlich crashed sobald du die Pointer verwenden willst...
-
Zeile 160 in der Swapchain
-
Naja, damit isses ja Offensichtlich: SwapChain ist ein Nullpointer.
-
verbesserungsvorschlag bitte denn ich sehe nicht das das ein nullpointer sein soll
-
In dem Fall heißt es wohl erstmal C++ lernen bevor du dich mit Direct3D beschäftigst...
-
Und du solltest anfangen, die Fehler-Rückgaben der verwendeten Funktionen zu überprüfen.
-
in deinem directx sdk, im control panel kannst du d3d auf debug stellen, du bekommst dann im debugger die fehler ausgegeben.