Dreieck zeichnen schlägt fehl



  • Hi leute,

    bin grad dabei ein paar tuts zu D3D durchzuarbeiten. Nun bin ich gerade dabei ein Dreieck zu zeichnen welches ich dann rotieren, skalieren, etc. kann, also in 3D. Wenn ich es aber zeichnen will kommt immer eine von mir Definierte Fehlermeldung das irgendwas beim zeichnen schief gegangen ist. Das Dreieck wird aber korrekt auf mein Fenster gezeichnet. Die Meldung kommt immer wenn ich mit der Maus aufs Fenster komm oder eine Taste drücke.
    Hier mal der Code:

    //************************************************
    //Name: InitScene
    //Desc: Bereitet alles zum Zeichnen vor,
    //		also die Punkte mit Werten belegen
    //		(ihre Koordinaten zuweisen)
    //************************************************
    int InitScene(void)
    {
    	//3DVertices initialisieren
    	triVertexD[0].vPosition.x		= 0.0f;
    	triVertexD[0].vPosition.y		= 0.0f;
    	triVertexD[0].vPosition.z		= 5.0f;
    	triVertexD[0].Color			= D3DCOLOR_ARGB(255, 255, 0, 0);
    
    	triVertexD[1].vPosition.x		= 2.0f;
    	triVertexD[1].vPosition.y		= -1.0f;
    	triVertexD[1].vPosition.z		= 5.0f;
    	triVertexD[1].Color			= D3DCOLOR_ARGB(255, 0, 255, 0);
    
    	triVertexD[2].vPosition.x		= -2.0f;
    	triVertexD[2].vPosition.y		= -1.0f;
    	triVertexD[2].vPosition.z		= 5.0f;
    	triVertexD[2].Color			= D3DCOLOR_ARGB(255, 0, 0, 255);
    
    	//Beleuchtung ausschalten
    	g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    
    	D3DXMATRIX projMatrix;
    	D3DXMatrixPerspectiveFovLH(&projMatrix, D3DX_PI/4.0f,
    				   fWindowHeight / fWindowLength,
    				   0.1f,50.0f);
    	g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &projMatrix);
    
    	return 0;
    }
    
    int Render(void)
    {
    	HRESULT hResult;
    
    	if(FAILED(hResult = g_pD3DDevice->BeginScene()))
    	{
    		D3DERROR("Fehler bei BeginScene()");
    		return -1;
    	}
    
    	//Backbuffer leeren und mit angegebner Farbe auffüllen
    	if(FAILED(hResult = g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 0, 0)))
    	{
    		D3DERROR("Fehler bei CLEAR()");
    		return -1;
    	}
    
    	//Draw2D();
    	Draw3D();
    
    	//Zeichne beenden
    	if(FAILED(hResult = g_pD3DDevice->EndScene()))
    	{
    		D3DERROR("Fehler bei EndScene()");
    		return -1;
    	}
    
    	//Szene sichtbar machen
    	if (FAILED(hResult = g_pD3DDevice->Present(NULL, NULL, NULL, NULL)))
    	{
    		switch (hResult)
    		{
    			case D3DERR_INVALIDCALL:
    			D3DERROR("Ungültiger Aufruf bei Present()!");
    			break;
    		}
    		D3DERROR("Szene konnte nicht dargestellt werden (Present).");
    		return -1;
    	} 
    	return 0;
    }
    
    //***********************************
    //Name: Draw3D
    //Desc: Zeichnet alle 3D Objekte auf 
    //		den Bildschirm
    //***********************************
    int Draw3D()
    {
    	HRESULT hResult;
    
    	g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);
    
    	if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, static_cast<void*>(&triVertexD), sizeof(Vertex))));
    	{
    		D3DERROR("Fehler beim zeichnen des 3D-Dreiecks");
    		return -1;
    	}
    	return 0;
    }
    

    InitScene belegt alle Vertices mit Koordinaten und setzt die Projektionsmatrix.
    Render bereitet alles zum zeichnen vor, also aufruf von BeginScene() und Clear() etc. und ruft Draw3D() auf, welche das Dreieck zeichnet.
    Render hab ich dann in der Nachrichtenschleife untergebracht.
    Meine WndProc() bearbeitet noch keine ankommenden Nachrichten ausser WM_DESTROY.

    Hoffentlich kann mir jemand helfen. Wenn ihr mehr Infos braucht, sagt bescheid.



  • welche Fehlermeldung kommt? Fehler beim Zeichnen des 3D-Dreiecks? 'Überprüf mal den Rückgabewert der fehlerhaften Funktion und schmeiß die Debug-Ausgabe von D3D an, dann Programm im Debugmodus starten, da steht dann bestimmt was los is.



  • Hi Maxi,
    danke für die Hilfe. Kannst mir sagen wie ich das alles mach? Hab mich noch nicht so mit Debug und co beschäftigt.
    P.S. Benutzt VS c++ 2005 Express.



  • Hehe, kann man ja schon fast zu FAQ hinzufügen, "wie schalt ich D3D in Debugmodus um", immerhin wurde es zwei mal innerhalb von etwa 10 minuten gefragt :p



  • habs grad geschrieben, so ging das jedenfalls unter win98, denk ma das das jetzt nich anders is. schau in den thread von andrey



  • ok,
    hab jetzt mal hResult nach dem Funktionsaufruf von DrawPrimitiveUP() auf seinen Wert hin mit einer if Abfrage getestet. Der Wert ist Null.
    Jetzt zweifle ich langsam an mir selber; ist nicht ein return-Wert von == 0 ein "erfolgrich" und != 0 ein "Fehler"?
    Wenn ja, warum gibt mir da FAILED-Makro das was falsches wieder?

    Oder liege ich jetzt total auf dem Holzweg 😕

    EDIT:
    Also gut. Habs entdeckt. In der Funktion Draw3D() war in der Zeile der if-Abfrage am Ende ein Semikolon. Kann man auch noch in meinem geposteten Code sehen.

    Aber warum streikt der Compiler da nicht. Was hat das Semikolon da für Auswirkungen???????



  • Weil du eigentlich das geschrieben hast:

    if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, static_cast<void*>(&triVertexD), sizeof(Vertex))))
        ;
    
    D3DERROR("Fehler beim zeichnen des 3D-Dreiecks");
    return -1;
    

    Das Semikolon stellt eine einzelne Anweisung dar, und das Semikolon ist die Anweisung, die bei Erfüllung der if-Abfrage ausgeführt wird (also nichts).

    Die nächsten beiden zeilen sind "normaler" Code und werden auf jeden Fall ausgeführt. Selbst wenn sie in geschweiften Klammern stehen. Die geschweiften Klammern fassen nur einen Block zusammen.


Log in to reply