Probleme beim Zeichnen des ersten Dreiecks mit DirectX
-
Hallo
Nachdem ich ein bisschen mit SDL programmiert habe, wollte ich mich mal mit DirectX auseinanderstezen und habe mit deshalb das Buch David Scherfgen organiesiert. Nun versuche ich gerade das erste richtige Porgramm zu (ab)zuschreiben und es klappt einfach nicht. Ich bekomme eine Fenster und die Hintergrundfrabe ist auch die angegebene, aber das rotierende Dreieck bekomme ich einfach nicht zu sehen.
Hier mal etwas Code:
die Render-Funktion:HRESULT hResult; tbMatrix mRotation(tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f))); tbMatrix mTranslation(tbMatrixTranslation(tbVector3(0.0f,0.0f,2.0f))); tbMatrix mWorld(mTranslation * mRotation); g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld)); if(FAILED(hResult = g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,63),1.0f,0))) { tbWriteToLog("Fehler beim Löschen der Buffer"); } g_pD3DDevice->BeginScene(); if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,g_aTriangleVertex,sizeof(SVertex)))) { tbWriteToLog("Fehler beim Zeichnen"); } g_pD3DDevice->EndScene(); g_pD3DDevice->Present(NULL,NULL,NULL,NULL); return TB_OK; }Hier mal noch die Funktion zum Initialisieren:
tbResult InitScene() { HRESULT hResult; hResult = g_pD3DDevice->SetFVF(D3DFVF_XYZW | D3DFVF_DIFFUSE); g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE); float fAspect = static_cast<float>(g_Direct3dParameters.VideoMode.Width) / static_cast<float>(g_Direct3dParameters.VideoMode.Height); tbMatrix mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f),fAspect,0.1f,100.0f); g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection)); g_aTriangleVertex[0].vPosition = tbVector3(0.0f,1.0f,0.0f); g_aTriangleVertex[1].vPosition = tbVector3(1.0f,-1.0f,0.0f); g_aTriangleVertex[2].vPosition = tbVector3(-1.0f,-1.0f,0.0f); g_aTriangleVertex[0].dwColor = tbColor(1.0f,0.0f,0.0f); g_aTriangleVertex[1].dwColor = tbColor(0.0f,1.0f,0.0f); g_aTriangleVertex[2].dwColor = tbColor(0.0f,0.0f,1.0f); return TB_OK; }Ich stehe wahrscheinlich mal wieder übel auf dem Schlauch, aber ich finde einfach nicht die Fehlerquelle.
-
Dort wo du hinschaust, ist kein Dreieck? In Wireframe schalten, Hintergrundfarbe ändern und DXDebug-Runtimes Ausgaben anschauen sind interessante Strategien.
Bye, TGGC (Fakten)
-
Hab den Code nur überflogen aber 2 Sachen sind mir aufgefallen:
1. Dein FVF besitzt den Value XYZW, was (vermutlich) für 4. dimensionale homogene Koordinaten steht. Deine Vertices sind aber dreidimensional. Benutze also XYZ (und Diffuse)
2. Du benutzt nicht-transformierte Vertices aber setzt nirgends eine View Matrix.(Anmerkung: Bei deiner Matrizenreihenfolge wird sich das Dreieck mit 90°/s um die globale Y-Achse drehen. Kann natürlich sein, dass du genau das willst:)Falls du also das Dreieck um seinen lokale y-Achse drehen lassen willst, musst du die Reihenfolge der Multiplikation vertauschen. )
-
Hallo
interpreter schrieb:
Hab den Code nur überflogen aber 2 Sachen sind mir aufgefallen:
1. Dein FVF besitzt den Value XYZW, was (vermutlich) für 4. dimensionale homogene Koordinaten steht. Deine Vertices sind aber dreidimensional. Benutze also XYZ (und Diffuse)Genau das war das Problem. Vielen Dank für die schnelle Hilfe.
chrische