Wieso wird der Hintergrund nicht gecleared?
-
HI!
Ich weiß leider noch nicht einmal wo der Fehler liegen könnte, deshalb poste ich mal den gesamten (kleinen Quellcode), Vorraussetzung: Datei textur.bmp (die lade ich als Sprite)main.cpp:
#include "windows.h" #include "Direct3D.h" #include <d3d8.h> // Headerdatei fuer Direct3D #include <d3dx8.h> // Eine in D3D integrierte Hilfsbibliothek #include <D3dx8tex.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); char szClassName[] = "Remoteit"; DX_Object dd_obj; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nShowCmd) { HWND hWnd; MSG msg; WNDCLASS wc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc.hCursor = LoadCursor(0, IDC_ARROW); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szClassName; wc.lpszMenuName = 0; wc.style = CS_VREDRAW | CS_HREDRAW; wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDC_ICON)); RegisterClass(&wc); hWnd = CreateWindow(szClassName, "OPXDav 1.0", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 568, 400, 0,0, hInstance, 0); ShowWindow(hWnd, nShowCmd); UpdateWindow(hWnd); while(GetMessage(&msg, 0,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } void Render() { LPD3DXSPRITE spritebsp; LPDIRECT3DTEXTURE8 spritetextur; D3DXVECTOR2 _pos; _pos.x = 100; _pos.y = 100; D3DXCreateSprite(dd_obj.lpD3DDevice, &spritebsp); D3DXCreateTextureFromFileA(dd_obj.lpD3DDevice, "textur.bmp", &spritetextur); spritebsp->Draw(spritetextur, 0, 0, 0, 0, &_pos, 0xFFFFFFFF); } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HDC hDC; switch(message) { case WM_SIZE: dd_obj.Init(hWnd); //dd_obj.lpBackbuffer->Release(); // Z-,Stncl Füllwert //while(TRUE) { dd_obj.lpD3DDevice->BeginScene(); dd_obj.lpD3DDevice->Clear(0, NULL, // Total löschen D3DCLEAR_TARGET | // RenderTarget leeren D3DCLEAR_STENCIL , // Z-Buf neu Füllen D3DCOLOR_XRGB(50,10,10), // leichtes Dunkelrot 1.0f, 0); Render(); dd_obj.lpD3DDevice->EndScene(); dd_obj.lpD3DDevice->Present(0,0,0,0); } break; case WM_DESTROY: PostQuitMessage(0); return 0; break; } return DefWindowProc(hWnd, message, wParam, lParam); }
Direct3D.h:
#include <d3d8.h> // Headerdatei fuer Direct3D #include <d3dx8.h> // Eine in D3D integrierte Hilfsbibliothek #include <windows.h> #define SCREEN_WIDTH 800 #define SCREEN_HEIGHT 600 #define SCREEN_BPP 16 class DX_Object { public: void Init(HWND main_window_handle) { lpD3D = Direct3DCreate8(D3D_SDK_VERSION); lpD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm); ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = FALSE; d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP; d3dpp.BackBufferFormat = d3ddm.Format; d3dpp.BackBufferWidth = SCREEN_WIDTH; d3dpp.BackBufferHeight = SCREEN_HEIGHT; d3dpp.BackBufferCount = 1; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE; d3dpp.hDeviceWindow = main_window_handle; if(lpD3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, d3ddm.Format, FALSE)==D3D_OK) { lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, main_window_handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &lpD3DDevice); } else { lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF , main_window_handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &lpD3DDevice); } lpD3D->GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, &AdapterIdentifier); //SetWindowText(main_window_handle, AdapterIdentifier.Description); lpD3DDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &lpBackbuffer); } DX_Object() { ZeroMemory(this, sizeof(DX_Object)); } LPDIRECT3D8 lpD3D; LPDIRECT3DDEVICE8 lpD3DDevice; D3DDISPLAYMODE d3ddm; D3DPRESENT_PARAMETERS d3dpp; LPDIRECT3DSURFACE8 lpBackbuffer; D3DADAPTER_IDENTIFIER8 AdapterIdentifier; };
Wäre klasse wenn sich jemand die Mühe macht und mir Einsteiger hilft
sänga
-
versuch mal:
dd_obj.lpD3DDevice->Clear(0, NULL, // Total löschen D3DCLEAR_TARGET , // Z-Buf neu Füllen D3DCOLOR_XRGB(50,10,10), // leichtes Dunkelrot 1.0f, 0);
da Stencil bzw. Depth Buffer(s) ja nicht erstellt wurden.
-
Ersetz mal das:
dd_obj.lpD3DDevice->BeginScene(); dd_obj.lpD3DDevice->Clear(0, NULL, // Total löschen D3DCLEAR_TARGET | // RenderTarget leeren D3DCLEAR_STENCIL , // Z-Buf neu Füllen D3DCOLOR_XRGB(50,10,10), // leichtes Dunkelrot 1.0f, 0);
durch das:
dd_obj.lpD3DDevice->Clear(0, NULL, // Total löschen D3DCLEAR_TARGET | // RenderTarget leeren D3DCLEAR_STENCIL , // Z-Buf neu Füllen D3DCOLOR_XRGB(50,10,10), // leichtes Dunkelrot 1.0f, 0); dd_obj.lpD3DDevice->BeginScene();
ich bin mir nicht sicher ob es daran liegt, aber ich mach es immer andersherum als in deinem Code
-
Hallo!
Es lag tatsächlich daran, dass ich keinen Stencilbuffer erstellt habe!! Ich hab noch eine Frage, wieso brauche ich das Begin/EndScene eigentlich nicht? Wenn ich das weglasse, wird trotzdem alles gerendertKevin
-
Hi,
einige Grafikkarten kommen ohne aus, andere wiederum nicht. Von daher sollte man auf diese Calls nicht verzichten.
Ciao,
Stefan