Nur ein Dreieck wird gezeichnet
-
Hallo zusammen,
also wie der Titel schon sagt, versuche ich zwei Dreiecke auf meinen Bildschirm zu bringen um ein Viereck darzustellen. Es wird aber immer nur eins davon gezeichnet, obwohl ich 6 Vertices korrekt initialsiert habe.
test[0].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); test[1].vPosition = D3DXVECTOR3(1.0f, 1.0f, 0.0f); test[2].vPosition = D3DXVECTOR3(-1.0f, 1.0f, 0.0f); test[3].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); test[4].vPosition = D3DXVECTOR3(1.0f, 1.0f, 0.0f); test[5].vPosition = D3DXVECTOR3(1.0f, -1.0f, 0.0f);Das steht in meiner InitScene() Funktion.
Zeichnen tu ich dann das Ganze mitint Draw3D() { HRESULT hResult; D3DXMATRIX mxProjection; D3DXMatrixPerspectiveFovLH(&mxProjection, g_fFov, fWindowLength/fWindowHeight, 0.1f, 50.0f); g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &mxProjection); D3DXMATRIX mxWorld; D3DXMatrixTranslation(&mxWorld, fWorldPosX, fWorldPosY, fWorldPosZ); g_pD3DDevice->SetTransform(D3DTS_WORLD, &mxWorld); g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE); if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, static_cast <void*>(&test), sizeof(Vertex)))) { D3DERROR("Fehler beim Zeichne des TesDreiecks"); return -1; } return 0; }Eine Besonderheit dabei:
Es werden immer nur die Vertices 4, 5, und 6 gezeichnet. Wenn der Code so aussieht...test[3].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); test[4].vPosition = D3DXVECTOR3(1.0f, 1.0f, 0.0f); test[5].vPosition = D3DXVECTOR3(-1.0f, 1.0f, 0.0f); test[0].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); test[1].vPosition = D3DXVECTOR3(1.0f, 1.0f, 0.0f); test[2].vPosition = D3DXVECTOR3(1.0f, -1.0f, 0.0f);...wird das andere Dreieck gezeichnet.
Woran könnte das liegen?
-
Hast Du's mal mit SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); versucht?
-
Yupp, macht keinen Unterschied. Worann kanns sonst noch liegen? Wenn mehr infos gebraucht werden nur fragen!!!
-
was passiert bei
SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);bzw.
SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);?
-
Hallo,
Ordne die Vertices deiner Dreiecke mal im Uhrzeigersinn an:test[0].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); test[1].vPosition = D3DXVECTOR3(1.0f, 1.0f, 0.0f); test[2].vPosition = D3DXVECTOR3(1.0f, -1.0f, 0.0f); test[3].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); test[4].vPosition = D3DXVECTOR3(-1.0f, 1.0f, 0.0f); test[5].vPosition = D3DXVECTOR3(1.0f, 1.0f, 0.0f);
-
Naja, wenn Culling abschalten nix bewirkt, dann wird auch das umordnen der Eckpunkte oder ein anderer Cull-mode nichts ändern.
Wie haste die Farben festgelegt? Doch nicht am Ende transparent?`Haste alpha-Blending mal abgeschaltet?
-
Mal dir die beiden Dreiecke mal mit Koordinaten auf ein Stück Papier. Wenn ich mich nicht gerade irre sind es zweil das selbe Dreieck. ^^
Das könnte dann deine Beobachtung erklären ^^
-
Ne, er hat 4 verschiedene Eckpunkte mit dabei.
-
Lassen sich beide Dreiecke einzeln zeichen?
-
hmm... von wo "gugste" auf das ganze, wie sieht denn deine camera (bzw VIEW) matrix aus? identitätsmatrix? werden die dreiecke also direkt auf die globale x-y ebene projeziert? und die nahe clipping ebene ist bei 0.1f?
Dürfte ich dann die frage stellen, wohin du eigentlich die dreiecke verschiebst, damit du überhaupt irgendetwas sehen kannst? wenn du als weltmatrix auch eine identitätsmatrix nimmst, sollte gar nichts zu sehen sein.
Zeig ma alle drei matrizen, vllt ist hier das problem.
Dann setze ich grad die drei matrizen mit exact denselben punkten ein, und schau, was bei mir rauskommt, hab nähmlich auch ebngrad meinen ersten oktaeder in DX gerendert
-
Also danke erstmal an alle für die Hilfe, echt prima dieses Forum

@User--:
Tja, die beiden Dreiecke lassen sich einzeln zeichnen und man sieht beide. Die Farbe habe ich bei beiden auf blau gestellt (mittels for-schleife). Aus irgendeinem Grund ist eine Ecke des Oberen Dreiecks (test-Vertices) Rot, trotz der for-schleife. Warum????//***********TESTDREIECKE**************** test[0].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); test[1].vPosition = D3DXVECTOR3(1.0f, 1.0f, 0.0f); test[2].vPosition = D3DXVECTOR3(-1.0f, 1.0f, 0.0f); int a = 0; for(a; a < 3; a++) { test[a].Color = D3DCOLOR_ARGB(255, 0, 0, 255); } test2[0].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); test2[1].vPosition = D3DXVECTOR3(1.0f, 1.0f, 0.0f); test2[2].vPosition = D3DXVECTOR3(1.0f, -1.0f, 0.0f); int c = 0; for(c; c < 3; c++) { test2[c].Color = D3DCOLOR_ARGB(255, 0, 0, 255); }@Andrey:
in meinem geposteten Code am Anfang siehst meine beiden Matrizen. Eine Projektions und eine Weltmatrix. Koordinaten der Weltmatrix sind 0, 0, 5.Aber warum kann ich nicht beide gleichzeitug zeichnen?????
Mein Ziel ist es einen Würfel so darzustellen (mach grad ein Tut durch) und bin noch nicht bei Index und Vertexbuffer. Deswegen zeichne ich es mit ner List und DrawPrimitiveUP().
EDIT:
Ok, hab mal den Hintergrund mit Rot gefüllt und siehe da:
Mein Würfel ist schwarz, deswegen kann ich ihn nicht sehen. Nur nehmen meine Vertices keine Farbe an, egal welche ich ihnen auch mit D3DCOLOR_ARGB zuweise. Hier mal meine Vertex-Struktur//Struktur um Vertices zu definieren typedef struct _VertexType { D3DXVECTOR3 vPosition; D3DCOLOR Color; }Vertex; typedef struct _CubeType { D3DXVECTOR3 vPosition; //Position des Würfels im Raum D3DXVECTOR3 vRotation; //Rotationsvektor für jede Achse float fSize; //Grösse des Würfels; zum Skalieren Vertex Vertices[36]; //Vertices des Würfels }Cube;Liegt es vielleicht an der definition der Strukturen, das die Vertices keine Farbe annehmen????
-
SetRenderState(D3DRS_LIGHTING, FALSE) hast du?
und SetFVF() hast du auch korrekt eingestellt?hab irgendwie den verdacht, dass du dich mit der byte-länge deines vertex ein bissl verrechnet hast. erste drei werte (position) werden noch korrekt ausgelesen, und der rest irgendwie querdurch aus dem speicher= das kann sein.
EDIT: nein, kann es nicht, das mit sizeof(Vertex) sieht auch korrekt aus... hmmmmm
Da ist noch was, was ich in meinem programm etwas anders stehn hab:
bei drawPrimitiveUP() castest du (&test) nach void*. was hat es für einen sinn? wenn "test" ein array vom typ _VertexType (..oder wie bei dir da der selbstgebastelte vertextyp heisst...) ist, dann muss du als parameter einfach nur "test" übergeben. das ist dann genau der anfang deines arrays, von welchem typ der zeiger ist, ist der funktion glaub ich wurscht.Device->DrawPrimitiveUp(D3DPT_TRIANGLELIST, 2, test, sizeof(MyOwnVertexStruct) );versuchs ma damit, wer weiß, vielleicht klappts...

-
Das mit dem Zeichnen hat sich erledigt. Es wird alles korrekt gezeichnet. Man sieht nix weil die Farbe der Vertices schwarz ist. Wenn ich ihnen aber eine andere Farbe zuweise mit D3DCOLOR_ARGB passiert nix. Es wird dem Vertex einfach keine Farbe zugeordnet.
Muss ich was beachten wenn ich Farben vergebe? Vielleicht die Art wie gezeichnet wird?
Das problem ist ja nur das der Code des Tuts funktioniert und er sich, bis auf Variablen-Namen, nicht grossartig von meinem Unterscheidet
-
Hast Du sie im FVF angegeben?
-
Wie meinst du das?
Mit SetFVF()? Da hab ich D3DFVF_XYZ | D3DFVF_DIFFUSE angegeben.
-
Hm, ich fürchte, da wirste noch etwas mehr Code zeigen müssen. Wir haben jetzt glaub ich alles naheliegende einmal geraten.
-
Also,
hier meine InitScene()-Funktionint InitScene(void) { //Aller Vertizes der Seiten wurden im Uhrzeigersinn angegeben //obere Seite des Würfels cube.Vertices[0].vPosition = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); cube.Vertices[1].vPosition = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); cube.Vertices[2].vPosition = D3DXVECTOR3(1.0f, 1.0f, 1.0f); cube.Vertices[3].vPosition = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); cube.Vertices[4].vPosition = D3DXVECTOR3(1.0f, 1.0f, 1.0f); cube.Vertices[5].vPosition = D3DXVECTOR3(1.0f, 1.0f, -1.0f); //vordere Seite des Würfels cube.Vertices[6].vPosition = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); cube.Vertices[7].vPosition = D3DXVECTOR3(1.0f, 1.0f, -1.0f); cube.Vertices[8].vPosition = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); cube.Vertices[9].vPosition = D3DXVECTOR3(1.0f, 1.0f, -1.0f); cube.Vertices[10].vPosition = D3DXVECTOR3(1.0f, -1.0f, -1.0f); cube.Vertices[11].vPosition = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); //untere Seite des Würfels cube.Vertices[12].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 1.0f); cube.Vertices[13].vPosition = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); cube.Vertices[14].vPosition = D3DXVECTOR3(1.0f, -1.0f, 1.0f); cube.Vertices[15].vPosition = D3DXVECTOR3(1.0f, -1.0f, 1.0f); cube.Vertices[16].vPosition = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); cube.Vertices[17].vPosition = D3DXVECTOR3(1.0f, -1.0f, -1.0f); //hintere Seite des Würfels cube.Vertices[18].vPosition = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); cube.Vertices[19].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 1.0f); cube.Vertices[20].vPosition = D3DXVECTOR3(1.0f, 1.0f, 1.0f); cube.Vertices[21].vPosition = D3DXVECTOR3(1.0f, 1.0f, 1.0f); cube.Vertices[22].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 1.0f); cube.Vertices[23].vPosition = D3DXVECTOR3(1.0f, -1.0f, 1.0f); //linke Seite des Würfels cube.Vertices[24].vPosition = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); cube.Vertices[25].vPosition = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); cube.Vertices[26].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 1.0f); cube.Vertices[27].vPosition = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); cube.Vertices[28].vPosition = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); cube.Vertices[29].vPosition = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); //rechte Seite des Würfels cube.Vertices[30].vPosition = D3DXVECTOR3(1.0f, 1.0f, -1.0f); cube.Vertices[31].vPosition = D3DXVECTOR3(1.0f, 1.0f, 1.0f); cube.Vertices[32].vPosition = D3DXVECTOR3(1.0f, -1.0f, -1.0f); cube.Vertices[33].vPosition = D3DXVECTOR3(1.0f, -1.0f, -1.0f); cube.Vertices[34].vPosition = D3DXVECTOR3(1.0f, 1.0f, 1.0f); cube.Vertices[35].vPosition = D3DXVECTOR3(1.0f, -1.0f, 1.0f); //Position des Würfels cube.vPosition.x = 0.0f; cube.vPosition.y = 0.0f; cube.vPosition.z = 5.0f; cube.vRotation = D3DXVECTOR3(0.0f, 0.0f, 0.0f); cube.fSize = 1.0f; //Grösse g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //Jedes Vertex eine andere Farbe int h = 0; for(h = 0; h < 35; h++); { cube.Vertices[h].Color = D3DCOLOR_ARGB(255, 0, 0, 255); } return 0; }Meine Draw3D() Funktion
nt Draw3D() { HRESULT hResult; g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE); D3DXMATRIX mxProjection; D3DXMatrixPerspectiveFovLH(&mxProjection, g_fFov, fWindowLength/fWindowHeight, 0.1f, 50.0f); g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &mxProjection); D3DXMATRIX mxWorld; D3DXMatrixTranslation(&mxWorld, fWorldPosX, fWorldPosY, fWorldPosZ); g_pD3DDevice->SetTransform(D3DTS_WORLD, &mxWorld); if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 12, &cube.Vertices, sizeof(Vertex)))) { D3DERROR("Fehler beim Zeichne des Würfels"); return -1; }Und meine Render()-Funktion
int Render(void) { HRESULT hResult; //Vorbereitungen fürs Zeichnen //+++++++++++++++++++++++++++++++++++++++ //Zeichen erlaubnis 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, 255, 0, 0), 0, 0))) { D3DERROR("Fehler bei CLEAR()"); return -1; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Vorbereitungen Ende //Zeichnen //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Draw3D(); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Zeichnen Ende //Alles Anzeigen //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Anzeigen Ende return 0;Kann es vielleicht an irgendwelchen Speicherresten liegen?
-
Zeig mal die Definition von Vertex und prüf mal vorm zeichnen mit TestCooperativeLevel ob auch wirklich alles mit dem device in Ordnung ist.
-
Meine definitionen stehen oben auf dieser Seite. Und wenn ich TestCooperativeLevel aufruf kommt "Identifier not found". Hab aber d3d9.h inkludiert. Wo sollte ich es denn Aufrufen?
EDIT:
Das mit TestCooperativeLevel hat sich erledigt #schäm#
Aber wo ich es am besten aufrufen soll kannste mir noch verraten. Habs in meine Draw3D Funktion gepackt vor den Zeichenaufruf.