Problem mit Initialisierung von Direct3D!!!



  • Hi!
    Ich wollte meine Engine jetzt mal testen!Ich wollte einfach nur Direct3D initialisieren und dann den Bildschirm in einer beliebigen Farbe anzeigen lassen!Aber irgendwas mache ich falsch!
    1. Das Fenster wird nicht im Vollbildmodus angezeigt!Man sieht immer den oberen Rand und man kann das Fenster auch verschieben!
    2.Das Fenster wird immer nur in weiß angezeigt!
    Hier der Code, der die Engine nutzt:

    #include "RBWRenderDevice.h"
    #include "RBWRenderer.h"
    
    bool bDone = false;
    bool g_bIsActive = false;
    HWND hwnd;
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
    
       WNDCLASSEX	wndclass;
       TCHAR       szAppClass[] = TEXT("FrameWorktest");
       MSG			msg;
    
       // Set up window attributes
       wndclass.cbSize         = sizeof(wndclass);
       wndclass.style          = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
       wndclass.lpfnWndProc    = WndProc;
       wndclass.cbClsExtra     = 0;
       wndclass.cbWndExtra     = 0;
       wndclass.hInstance      = hInstance;
       wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
       wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
       wndclass.hbrBackground  = (HBRUSH)(COLOR_WINDOW);
       wndclass.lpszMenuName   = NULL;
       wndclass.lpszClassName  = szAppClass;
       wndclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    
       if(RegisterClassEx(&wndclass) == 0)
          return 0;
    
       // create window
       hwnd = CreateWindowEx(NULL, szAppClass,
    	   		             "Demo Application",
    				          WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    			 	          GetSystemMetrics(SM_CXSCREEN)/2 -1280 / 2,
                              GetSystemMetrics(SM_CYSCREEN)/2 - 1024 / 2,
    				           1280, 1024, NULL, NULL, hInstance, NULL);
    
    	ShowWindow(hwnd, SW_HIDE);
    	ShowWindow(hwnd, SW_SHOW);
    	LPRBWRENDERER g_pRenderer = NULL;
    	LPRBWRENDERDEVICE g_pDevice = NULL;
    	g_pRenderer = new RBWRenderer(hInstance);
    	g_pRenderer->CreateDevice("Direct3D");
    	g_pDevice = g_pRenderer->GetDevice();
    	g_pDevice->Init(hwnd);
    
    	while(!bDone)
    	{
    		while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		};
    		if(g_bIsActive) {
    			g_pDevice->BeginRendering(true, true, true);
    			g_pDevice->Clear(true, true, true);
    			g_pDevice->EndRendering();
    		}
    
    	};
    	g_pRenderer->Release();
    	g_pDevice->Release();
    	return (int)msg.wParam;
    };
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    		      // our app has the focus
          case WM_ACTIVATE: {
             g_bIsActive = bool(wParam);
             } break;
    
          // key was pressed
          case WM_KEYDOWN: {
             switch (wParam) {
                case VK_ESCAPE: {
                   bDone = true;
                   PostMessage(hwnd, WM_CLOSE, 0, 0);
                   return 0;
                   } break;
                }
             } break;
    
          // we are ordered to suicide
          case WM_DESTROY: {
             bDone = true;
             PostQuitMessage(0);
             return 1;
             } break;
    
          default: break;
          }
    
       return DefWindowProc(hwnd, message, wParam, lParam);
       }
    

    ICh weiß, der Code ist etwas schlampig!Aber ich wollte einfach nur mal eine DemoApplikation für meine Engine schreiben!
    Ich hoffe, ihr könnt mir helfen!



  • Hi,

    1. mit der WinMain können wa sehr wenig anfangen, wir müssten wennschon deine Init sehen.
    2. Mit den strukturen können wa auch sehr wenig anfangen ohne zu wissen was sie machen. (doku?)
    3. Crossposting sehen viele nicht gerne:
    http://www.scherfgen-software.net/forum/viewtopic.php?t=1474

    Tschüss,
    Patrick 🙂



  • Wenn ich eine Frage in mehreren Foren sehe, antworte ich aus Prinzip nicht.
    Das geht vielleicht anderen Leuten auch so, also solltest Du das sein lassen.



  • Sorry!
    Ok hier die init!Die habe ich jetzt einfach nur auf meinen Rechner abgestimmt!Die wird erst später noch erstellt:

    bool RBWD3D::Init(HWND hwnd)
    {
    
    	this->m_hwnd = hwnd;
    	D3DADAPTER_IDENTIFIER9* pAdapter;
    	D3DDISPLAYMODE *m_pModes;
    	D3DPRESENT_PARAMETERS pParameters;
    	int iNumModes;
    	int iNumAdapters;
    
    	//Direct3D9 Schnittstelle erzeugen
    	m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    	if(m_pD3D == NULL)
    	{
    		MessageBox(NULL, "Direct3D konnte nicht initialisiert werden!", "Fehler", MB_OK |MB_ICONEXCLAMATION);
    	}
    
    	//Anzahl an verfügbaren Adaptern speichern
    	iNumAdapters = m_pD3D->GetAdapterCount();
    	if(iNumAdapters == 0)
    	{
    		MessageBox(NULL, "Direct3D konnte nicht initialisiert werden \n Es wurde keine Grafikkarte gefunden", 
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    	}
    
    	//Soeicher reservieren
    	pAdapter = new D3DADAPTER_IDENTIFIER9[iNumAdapters];
    
    	//Alle Adapter durchlaufen und Informationen speichern
    	for(int i = 0; i < iNumAdapters; ++i)
    	{
    		if(FAILED(m_pD3D->GetAdapterIdentifier(i, 0, &pAdapter[i])))
    		{
    			MessageBox(NULL, "Direct3D konnte nicht initialisiert werden! \n Adapterinformationen konnten nicht abgefragt werden.",
    				      "Fehler", MB_OK |MB_ICONEXCLAMATION);
    		}
    
    		//Anzahl der vefügbaren Videomodi herausfinden
    		iNumModes = m_pD3D->GetAdapterModeCount(i, D3DFMT_R5G6B5);
    		if(iNumModes == 0)
    		{
    			MessageBox(NULL, "Direct3D konnte nicht initialisiert werden \n Es wurden keine Videomodi gefunden",
                           "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		}
    
    		//Speicher für Videomodi reservieren
    		m_pModes = new D3DDISPLAYMODE[iNumModes];
    
    		//Alle verfügbaren Videomodi durchlaufen
    		for (int iModes = 0; iModes < iNumModes; ++iModes)
    		{
    			m_pD3D->EnumAdapterModes(i, D3DFMT_R5G6B5, iModes, &m_pModes[iModes]);
    		}
    
    	};
    
    		//Speicherplatz wieder freigeben
    		delete[] pAdapter;
    		delete[] m_pModes;
    
    		//Fähigkeiten des Gerätes herausfinden und speichern
    		m_pD3D->GetDeviceCaps(iNumModes, D3DDEVTYPE_HAL, &m_DeviceCaps);
    
    		pParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
    		pParameters.BackBufferFormat = D3DFMT_X8R8G8B8;
    		pParameters.BackBufferCount = 1;
    		pParameters.AutoDepthStencilFormat = D3DFMT_D24S8;
    		pParameters.EnableAutoDepthStencil = true;
    		pParameters.hDeviceWindow = m_hwnd;
    		pParameters.Windowed = false;
    		pParameters.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    		pParameters.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    		pParameters.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
    		pParameters.BackBufferWidth = 1280;
    		pParameters.BackBufferHeight = 1024;
    		pParameters.MultiSampleType = D3DMULTISAMPLE_NONE;
    		pParameters.MultiSampleQuality = 0;
    
    		if(FAILED(m_pD3D->CreateDevice(0,
    			                           D3DDEVTYPE_HAL,
    									   m_hwnd,
    									   D3DCREATE_HARDWARE_VERTEXPROCESSING,
    									   &pParameters,
    									   &m_pD3DDevice)))
    		{
    			MessageBox(NULL, "Direct3D konnte nicht initialisiert werden000", "Fehler", 
    				       MB_OK | MB_ICONEXCLAMATION);
    		} else
    			m_isInit = true;
    		return true;
    };
    


  • pParameters.Windowed = false;

    Diese Zeile kommt mir stark verdächtig vor 😉



  • Wieso?



  • illuminator schrieb:

    pParameters.Windowed = false;

    Diese Zeile kommt mir stark verdächtig vor 😉

    Wieso das???



  • ich nehms zurück...

    *merkzettel:hirn hochfahren, dann antworten; true!=false*

    *peinlich* 🙄



  • Ohhh ich voll Idiot!!!!!Ich hatte bei meiner Methode "EndRendering" vergessen Present aufzurufen!Dann kann ja auch nichts angezeigt werden, wenn man das vergisst!
    Danke für eure Hilfe!Es funztjetzt!


Anmelden zum Antworten