direct3D9 Init
-
Hallo!
Ich hab nen Problem mit meiner Initialisierung ovn Direxct3D9. Es funktioniert nciht mit Geforce 2.
An die Funktio iwrd ein Zeiger auf eine Config-Struktur übergeben. Alee elemente werden mit dieser Funktion ausgefüllt
// Direct3D-Schnittstelle erstellen if(NULL == (m_Direct3D = Direct3DCreate9(D3D_SDK_VERSION))) return ME_ERROR; if(FAILED(m_Direct3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &m_D3DCaps))) return ME_ERROR; // Anzahl der Videomodes mit für format abfragen int ModeNum = m_Direct3D->GetAdapterModeCount(D3DADAPTER_DEFAULT, format); // wenn nicht verfügbar -> Fehler if(ModeNum == 0) { meErrorLog("Kein verfügbarer Videomode mit gewünschtem Format vorhanden!"); m_Direct3D->Release(); return ME_ERROR; } // Array für die Videomodes erstellen D3DDISPLAYMODE* VideoModes = new D3DDISPLAYMODE[ModeNum]; // Zählvarialbe für die Videomodes erstellen int Mode = 0; if(Windowed) { // Im Fenster muss der aktuelle VideoMode benutzt werden, // es wird das gewünschte Format ignoriert. // Es wird nur das erste Element des D3DDISPLAYMODE-Arrays ausgefüllt m_Direct3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &VideoModes[0]); Mode = 0; } else { for(Mode = 0; Mode < ModeNum; Mode++) { // VideoModes ausfüllen lassen m_Direct3D->EnumAdapterModes(D3DADAPTER_DEFAULT, format, // wird als parameter übergeben R5G6B5 Mode, &VideoModes[Mode]); // Testen, ob der gewünschte Videomodus gefunden wurde: if(VideoModes[Mode].Width == Width && VideoModes[Mode].Height == Height) break; } } // Testen, ob Format für Bildpuffer und Z-Buffer unterstützt wird if(FAILED(m_Direct3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, // Adapter-ID D3DDEVTYPE_HAL, // Gerätetyp VideoModes[Mode].Format, // Format des Adapters D3DUSAGE_RENDERTARGET, // Verwendungszweck D3DRTYPE_SURFACE, // Resourcentyp VideoModes[Mode].Format)) // zu testendes Format || FAILED(m_Direct3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, VideoModes[Mode].Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24S8))) { // Wenn nicht, dann Fehler delete [] VideoModes; m_Direct3D->Release(); return ME_ERROR; } ZeroMemory(config, sizeof(meScreenConfig)); config->Adapter = D3DADAPTER_DEFAULT; config->BackBufferFormat = VideoModes[Mode].Format; config->ZStencilFormat = D3DFMT_D24S8; config->DevType = D3DDEVTYPE_HAL; config->DisplayMode = VideoModes[Mode]; config->DisplayMode.Width = Width; config->DisplayMode.Height = Height; config->Windowed = Windowed; // Flags erfragen, ob das pure Gerät verwendet werden soll if(!(m_D3DCaps.DevCaps & D3DDEVCAPS_HWRASTERIZATION) || !(m_D3DCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)) { config->Flags = D3DCREATE_SOFTWARE_VERTEXPROCESSING; meInfoLog("SOFTWARE_VP"); } else if(m_D3DCaps.DevCaps & D3DDEVCAPS_PUREDEVICE) { meInfoLog("HARDWARE_VP"); config->Flags = D3DCREATE_HARDWARE_VERTEXPROCESSING; } else { meInfoLog("SOFTWARE_VP"); config->Flags = D3DCREATE_SOFTWARE_VERTEXPROCESSING; } config->MultiSampleType = D3DMULTISAMPLE_NONE; config->MultiSampleQuality = 0; delete [] VideoModes; m_Direct3D->Release(); m_Direct3D = NULL; meInfoLog("Konfigurationsstruktur erfolgreich erstellt!");
Dann wird werden die Present_Params damit ausgefüllt:
m_Direct3D = Direct3DCreate9(D3D_SDK_VERSION); if(m_Direct3D == NULL) return ME_ERROR; D3DPRESENT_PARAMETERS d3dpp; d3dpp.BackBufferWidth = config->DisplayMode.Width; d3dpp.BackBufferHeight = config->DisplayMode.Height; d3dpp.BackBufferCount = 1; d3dpp.BackBufferFormat = config->DisplayMode.Format; d3dpp.MultiSampleType = config->MultiSampleType; d3dpp.MultiSampleQuality = config->MultiSampleQuality; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = m_AppWnd; // wurde vorher erstellt d3dpp.Windowed = config->Windowed; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = config->ZStencilFormat; d3dpp.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; if(FAILED(m_Direct3D->CreateDevice(config->Adapter, config->DevType, m_AppWnd, config->Flags, & d3dpp, &m_D3DDevice))) { m_Direct3D->Release(); meErrorLog("Fehler beim ERstellen der Geräteschnittstelle (PDIRECT3D::CreateDevice())"); return ME_ERROR; // Bei Geforce failed es }
ich hoffe ihr könnt mir helfen ...
-
Beseitige den Fehler.
Bye, TGGC
-
lol?