C++ Syntax aber Direct3D Funktionen? Hier richtig?



  • Irgendwie möchte ich gerne die Initialisierungsprozedur von Direct3D in eine Klasse verpacken, und habe mir zu dem Zweck eine Funktion InitD3D geschrieben, erstmal der Quellcode, anschließend die Fragen:

    /* Default Parameters wdth=800, hght=600 */
    bool BigWindow::initD3D(unsigned wdth,unsigned hght){
    
    	/* LOCAL DATA */
    	D3DCAPS9 d3dcaps;
    	D3DPRESENT_PARAMETERS d3dpp;
    	D3DDISPLAYMODE d3ddm;
    	DWORD vertexproc=0;
    	unsigned amountOfDM=0;
    	unsigned i=0;
    
    	/* OPERATIONS */
    	if(NULL==(this->pd3d=Direct3DCreate9(D3D_SDK_VERSION)))
    		return false;
    
    	/* How many AdapterModes are there with D3DFMT_X8R8G8B8? */
    	amountOfDM=this->pd3d->GetAdapterModeCount(D3DADAPTER_DEFAULT,
    		D3DFMT_X8R8G8B8);
    
    	/* Is the D3DFMT_X8R8G8B8 compatible with the wdth_hght paramters
    	   that were given to this Function? */
    	for(i=0;i<amountOfDM;i++){
    		pd3d->EnumAdapterModes(D3DADAPTER_DEFAULT,D3DFMT_X8R8G8B8,i,&d3ddm);
    		if(d3ddm.Width==wdth && d3ddm.Height==hght){
    			this->width=wdth;
    			this->height=hght;
    			break;
    		}
    	}
    	if(i==amountOfDM) // No? Return False!
    		return false;
    
    	/* Hardware T+L available? */
    	if(FAILED(this->pd3d->GetDeviceCaps(D3DADAPTER_DEFAULT,
    		D3DDEVTYPE_HAL,&d3dcaps)))
    		return false;
    
    	if(d3dcaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
    		vertexproc=D3DCREATE_HARDWARE_VERTEXPROCESSING;
    	else
    		vertexproc=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
    
    	/* Can D3DFMT_X8R8G8B8 be used together with depth buffer D3DFMT_D16? */
    	if(FAILED(pd3d->CheckDeviceFormat(D3DADAPTER_DEFAULT,
    		D3DDEVTYPE_HAL,D3DFMT_X8R8G8B8,D3DUSAGE_DEPTHSTENCIL,
    		D3DRTYPE_SURFACE,D3DFMT_D16)))
    		return false;
    
    	/* Fill the D3DPRESENT_PARAMETERS Structure */
    	d3dpp.AutoDepthStencilFormat=D3DFMT_D16; // confirmed using CheckDeviceFormat
    	d3dpp.BackBufferCount=1;
    	d3dpp.BackBufferFormat=D3DFMT_X8R8G8B8; // confirmed using EnumAdapterModes
    	d3dpp.BackBufferHeight=height; // confirmed using EnumAdapterModes
    	d3dpp.BackBufferWidth=width; // confirmed using EnumAdapterModes
    	d3dpp.EnableAutoDepthStencil=true;
    	d3dpp.Flags=0;
    	d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT; // ?
    	d3dpp.hDeviceWindow=this->hwnd; // the WS_POPUP window needed for Fullscreen
    	d3dpp.MultiSampleQuality=0;
    	d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
    	d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT; // ?
    	d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; // recommended (why?)
    	d3dpp.Windowed=false;  // Fullscreen
    
    	if(FAILED(pd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
    		this->hwnd,vertexproc,&d3dpp,&pd3dDevice)))
    		return false;
        return true;
    }
    

    Jetzt die Fragen:
    1. Was genau ist ein Stencil Buffer?
    2. Ist die Funktion flexibel genug implementiert, um mit ihr auch in Zukunft vernünftig arbeiten zu können? Oder verträgt sie noch ein paar Parameter extra?
    3. Was ist der Unterschied zwischen D3DPRESENT_INTERVAL_DEFAULT und D3DPRESENT_RATE_DEFAULT? Beides bezieht sich doch darauf, wie oft pro Sekunde das Bild auf dem Bildschirm neu gezeichnet wird? Warum dann zwei verschiedene Parameter in der D3DPRESENT_PARAMETERS Struktur?
    4. Das Fenster-Handle muss ich doch zweimal angeben, einmal bei der D3DPRESENT_PARAMETERS Struktur, und das zweite Mal bei der CreateDevice() Funktion? Mein Buch setzt nämlich den HWND der D3DPRESENT_PARAMETERS Struktur immer auf NULL, aber aus Prinzip soll diese Funktion nicht Windowed Direct3D Devices erzeugen, sondern Fullscreen! Dann muss ich doch sicherlich auch den HWND Parameter in der D3DPRESENT_PARAMETERS Struktur auf den Wert des Popup Fensters setzen, das (früher schon einmal) erzeugt wurde?
    5. Was kann man tun, wenn D3DDEVTYPE_HAL nicht vorhanden ist? Dann funktioniert Direct3D vermutlich überhaupt nicht?

    Danke für alle Antworten, die helfen, mein Wissensdefizit bezüglich Direct3D-Initialisierungen zu beheben!



  • Warum kommentierst du ein ohnehin ausreichend dokumentiertes API aus?

    MfG



  • Was hat Deine Frage jetzt mit dem Problem zu tun ? Sowas dummes ! Einfach mal die F.... halten, wenn man nichts zu sagen hat Du Horst ! 👎



  • Grafiknewbie99 schrieb:

    1. Was genau ist ein Stencil Buffer?

    Ein Stencil Buffer dient zum maskieren von Bereichen im Framebuffer. Im Prinzip funktioniert er ähnlich wie ein Depth Buffer - für jedes Pixel im Color Buffer gibt es einen definierbaren Eintrag im Stencilbuffer. Mit verschiedenen Fail/Pass-Kriterien kannst du so Masken erzeugen, die z. B. für Schattenberechnungen verwendet werden können.

    5. Was kann man tun, wenn D3DDEVTYPE_HAL nicht vorhanden ist? Dann funktioniert Direct3D vermutlich überhaupt nicht?

    Dann steckt keine unterstützte Karte im System und das Programm kann D3D nicht benutzen. Früher gabs noch ein REF-Device, was alle Funktionen in Software nachgebildet hat. Das wurde aber mit Direct3D 9 abgeschafft.

    Es gibt viele Tutorials bzgl. D3D im Netz, insbesondere die Initialisierung betreffend. Google ist dein Freund.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten