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?


Anmelden zum Antworten