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=1474Tschü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!