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 gerendert 😕

    Kevin



  • Hi,

    einige Grafikkarten kommen ohne aus, andere wiederum nicht. Von daher sollte man auf diese Calls nicht verzichten.

    Ciao,
    Stefan


Anmelden zum Antworten