directx-initialisations absturz



  • so, ich hab mich mithilfe eines buches an directx9 gewagt, leider hab ich zuspät gemerkt, dass das buch drauf hinausläuft, dass man die mitgelieferten quellcodes benutzen soll,wobei aber die einzelnen funktionen und ihre rückgabewerte doch noch etwas beschrieben werden, sodass ich in der lage war, mir eine primitive directx initialiserung nachzuproggen 😉

    leider stürzt das programm einfach mit ner access violation ab.

    ich konnte nun den fehler soweit einkreisen, dass es eigentlich nur 2 stellen sein können:

    1.die anti aliasing qualitylevels. im buch steht dazu einfach, dass die dazu passende funktion einen zeiger auf den dword wert benötigt, indem sie dann(je nachdem, welche qualitylvls vom adapter unterstützt werden)die werte ablegt.
    nun ist natürlich die frage, wie ich die einzelnen werte dann auseinanderfriemel, da ich mir nicht sicher bin, dass es richtig ist, den rückgabewert einfach so der createdevice methode zu übergeben 😉

    2. die createdevice methode selber:
    ich bin mir nicht sicher, ob ich alle werte richtig definiert und eingegeben hab, da sich das buch da sehr sehr kurz gehalten hat:

    IDirect3DDevice9* g_pD3DDevice;
    //parameter steht für die D3DPRESENT_PARAMETERS structur
    //g_pD3D steht für die directx schnittstelle,hwnd ist halt der fensterzeiger
    g_pD3D->CreateDevice(adapterid,D3DDEVTYPE_HAL,hwnd,D3DCREATE_PUREDEVICE|
    D3DCREATE_HARDWARE_VERTEXPROCESSING,parameter,&g_pD3DDevice)
    

    ich hoffe, ich hab keine zu schwerwiegenden fehler gemacht, bzw die fehler sind aus dem code zu entnehmen 😃



  • hast du überhaupt ein D3D9 Objekt erstellt? (per DDirect3DCreate9)



  • ohne die schnittstelle kann man keinen einzigen grafikmodus abfragen, also ja 😃

    //edit so, hab nu mal den fehlercode analysiert, der mir von der funktion übermittelt wird: invalid call



  • otze schrieb:

    ohne die schnittstelle kann man keinen einzigen grafikmodus abfragen, also ja 😃

    //edit so, hab nu mal den fehlercode analysiert, der mir von der funktion übermittelt wird: invalid call

    D.h. normalerweise, Du übergibst Flags oder so in ungültiger Kombination, o.ä.



  • kann es das sein, was ich bei anti aliasing als problem angegeben hab? das die dword variable vielleicht mehr als einen wert enthällt?
    wenn ja, wie kann ich die werte auseinanderfriemeln?

    //edit
    also ich komme so langsam dem fehler auf die spur:

    IDirect3DDevice9* g_pD3DDevice;
    

    also, wenn das so richtig ist,wieso schlägt die funktion g_pD3DDevice->Release() fehl?
    wird sie erst durch die funktion createdevice erstellt? oder muss ich mich drum kümmern, dass die struktur vorher da ist?



  • Jo, klar. Release() kannst Du nur aufrufen (sinnvoll), wenn Du auch ein Objekt hast.
    Danach noch NULL setzen.

    Äh, parameters übergibst Du aber korrekt?!



  • ich weis nich, deshalb hab ich doch oben den betreffenden code reingeschrieben 😉



  • Ja klar, bei "adapterid" und "parameter", wüßte ich sogar wenn ich nicht grundsätzlich keine Quellcodes korrigiere, sofort das es vollkommen korrekt ist.

    Tipp: Leg Buch weg und benutze DXSDK Doku und Verstand.

    Bye, TGGC (Der Held ist zurück)



  • ich dachte eigentlich, mit parameters wären die funktionsparameter gemeint,bei der structur genannt parameter bin ich mir aber inzwischen sogut wie sicher, dass ich die werte alle richtig übergeben hab. zweifel hab ich nur bei dem zeiger auf die struktur g_pD3DDevice. im buch und in der hilfe steht,dass der typ IDirect3DDevice9** ist, aber ich krieg es so nich hin,ich bekomme dann heap fehler,und übergeb ihm stattdessen die speicheraddresse eines zeigers vom typ IDirect3DDevice9*

    aber alles mal genauer 😉

    hier die funktion die die parameter erstellt

    D3DPRESENT_PARAMETERS* CardCaps::checker(){
    	D3DPRESENT_PARAMETERS* var=NULL;
    	if(this->bildpuffer1024==true||this->bildpuffer800==true){
    		D3DPRESENT_PARAMETERS* D3DPARAM=new D3DPRESENT_PARAMETERS;
    		D3DFORMAT mode[4];
    		mode[0]=D3DFMT_D24S8;
    		mode[1]=D3DFMT_D24X4S4;
    		mode[2]=D3DFMT_D24X8;
    		mode[3]=D3DFMT_D32;
    		int zaehler=0;
    		while(zaehler<4&&D3DPARAM->MultiSampleType!=D3DMULTISAMPLE_4_SAMPLES){
    			if(this->Anti_Aliasing[zaehler]==true){
    				if(this->bildpuffer1024==true||this->bildpuffer800==true){
    					ZeroMemory(D3DPARAM,sizeof(D3DPRESENT_PARAMETERS));
    					if(this->bildpuffer1024==true){
    						D3DPARAM->BackBufferWidth=1024;
    						D3DPARAM->BackBufferHeight=768;
    						D3DPARAM->FullScreen_RefreshRateInHz=this->refresh1024;
    					}
    					else
    					{
    						D3DPARAM->BackBufferWidth=800;
    						D3DPARAM->BackBufferHeight=600;
    						D3DPARAM->FullScreen_RefreshRateInHz=this->refresh800;
    					}
    					D3DPARAM->BackBufferFormat=D3DFMT_R5G6B5;
    					D3DPARAM->BackBufferCount=0;
    					D3DPARAM->MultiSampleType=D3DMULTISAMPLE_4_SAMPLES;
    					D3DPARAM->MultiSampleQuality=this->Quality[zaehler];
    					D3DPARAM->SwapEffect=D3DSWAPEFFECT_FLIP;
    					D3DPARAM->hDeviceWindow=hwnd;
    					D3DPARAM->Windowed=false;
    					D3DPARAM->EnableAutoDepthStencil=true;
    					D3DPARAM->AutoDepthStencilFormat=mode[zaehler];
    					D3DPARAM->PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
    					var=D3DPARAM;
    				}
    			}
    			else
    			{
    				zaehler++;
    			}
    		}
    		if(var==NULL){
    			delete[] D3DPARAM;
    		}
    	}
    	return var;
    }
    //in der funktion gehts nich darum, möglichst effektiv zu sein, sondern ersteinmal zu laufen, btw der nullzeiger wird abgefangen ;)
    

    hier mal die struktur, aus der die daten kommen

    struct CardCaps{//fähigkeiten der karte bei den auflösungen 800*600(0) und 1024*768(1)
    
    	//letzter prüfer, der erkennt ob alles korrekt ist, und dann die     
             //parameterstruktur für die erstellung erstellt
    	D3DPRESENT_PARAMETERS* checker();
    	bool D3DFMT[4];
    
    	bool bildpufferformat;
    	unsigned int refresh1024;
    	bool bildpuffer1024;
    	unsigned int refresh800;
    	bool bildpuffer800;
    	bool Anti_Aliasing[4];
    	DWORD Quality[4];
    };
    

    adapterid ist die nummer des adapters, bei dem die funktion checker()einen zeiger ungleich null zurückgibt.

    D3DPRESENT_PARAMETERS* parameter;
    	int adapterid=0;
    	bool adapterfound=false;
    	while(adapterid<=g_inum_Adapters&&adapterfound==false){
    		if(Caps[adapterid].checker()!=NULL){
    			parameter=Caps[adapterid].checker();
    			adapterfound=true;
    		}
    		else
    		{
    			adapterid++;
    		}
    	}
    

    ps: ich benutze meinen verstand seit meiner geburt, und du darfst gerne deine fast beleidigende ironie stecken lassen.



  • es klappt nu 😉
    es lag am multisampling, und an punkt1, war nämlich die komplett falsche struktur(obwohl die hilfe genau das gleiche angegeben hat^^)


Anmelden zum Antworten