2009-08-28 12 views
0

Ich bin absolut neu in DirectX und ich möchte einige nicht transformierte Primitive mit der einfachsten Direct3D-Konfiguration (für Lernzwecke) zeichnen. Ich habe bereits einige Primitive mit transformierten Vertices gezeichnet, das sind Vertices mit dem gesetzten D3DFVF_XYZRHW Flag.Am einfachsten transformierte Vertex-Zeichnung mit Direct3D

Jetzt versuche ich, die gleiche Ausgabe mit nicht transformierten Vertices zu bekommen, aber ich bekomme keine Visuals auf dem Bildschirm. Ich habe meine FVF geändert und die Scheitelpunkte angepasst, aber noch keine Transformationsmatrix (Welt, Ansicht, Projektion) festgelegt. Ist es notwendig, eine dieser Matrizen zu setzen? Ich würde annehmen, dass alles genauso funktioniert wie mit transformierten Vertices, wenn keine Matrizen gesetzt sind, aber das ist offensichtlich nicht der Fall.

Welcher Bereich (in Weltkoordinaten) ist standardmäßig sichtbar? Was muss ich tun, damit es funktioniert?

Dies ist im Grunde, was ich tue:

struct Vertex 
{ 
    float x, y, z; 
    D3DCOLOR color; 

    static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE; 
}; 


const Vertex vertices[] = { 
          {0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}, 
          {0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}, 
          {-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)} 
          }; 


pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL); 

VOID* vertexData = 0; 
pVB->Lock(0, sizeof(vertices), &vertexData, 0); 
memcpy(vertexData, vertices, sizeof(vertices)); 
pVB->Unlock(); 



D3DMATRIX matrixIdentitiy; 
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy)); 
matrixIdentitiy._11 = 1.0f; 
matrixIdentitiy._22 = 1.0f; 
matrixIdentitiy._33 = 1.0f; 
matrixIdentitiy._44 = 1.0f; 

pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy); 
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy); 
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy); 



pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0); 
pd3dDevice->BeginScene(); 

pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); 
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE); 
pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); 

pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex)); 
pd3dDevice->SetFVF(Vertex::format); 
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); 

pd3dDevice->EndScene(); 
pd3dDevice->Present(NULL, NULL, NULL, NULL); 

Vielen Dank im Voraus!

EDIT: Jetzt habe ich es, Beleuchtung wurde aktiviert, dummer Anfänger Fehler. Danke für deine Hilfe trotzdem!

Antwort

1

Nun, wenn Sie Ihre Welt, Ansicht und Projektion Matrizen zur Identität, dann was Sie erhalten, ist ein einfacher Durchgang durch.

x wird von -1 bis 1
y reichen von -1 bis 1
z von 0 bis 1 (Dieses Bit kann zu Problemen führen) wird Reichweite Die Reichweite wird.

Wenn Sie dann Standard untransformierte Verts definieren und sie innerhalb dieses Bereichs weiterleiten, werden sie auf dem Bildschirm angezeigt.

Wenn das nicht helfen, einige Code zu posten und ich werde sehen, was ich vorschlagen kann.

Edit: Haben Sie Z-Buffering aktiviert? Weil Sie Ihren Z-Puffer nicht löschen, was zu seltsamen Problemen führen könnte. Alles wird dahinter rendern und daher niemals rendern.

Set

pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); 

oder

pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); 

diese Hypothese zu testen.

Es ist auch sehr lohnenswert zu lernen, wie man PIX verwendet und dann sieht, was mit Ihrem Dreieck passiert, während es durch die Szene läuft.

Edit2:

Es ist möglich, dass Ihr Problem von der Beleuchtung kommt. Versuchen Beleuchtung ausschalten

dh

pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); 

finden Sie Ihre Clear dies zu ändern:

pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0); 

Und überprüfen Sie, ob Ihre Polys schwarz rendern.

+0

Guten Punkt, ich den Z-Buffer-Test, aber das Problem bleibt deaktiviert. –

0

Dies ist im Grunde, was ich tue:

struct Vertex 
{ 
    float x, y, z; 
    D3DCOLOR color; 

    static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE; 
}; 


const Vertex vertices[] = { 
          {0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}, 
          {0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}, 
          {-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)} 
          }; 


pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL); 

VOID* vertexData = 0; 
pVB->Lock(0, sizeof(vertices), &vertexData, 0); 
memcpy(vertexData, vertices, sizeof(vertices)); 
pVB->Unlock(); 



D3DMATRIX matrixIdentitiy; 
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy)); 
matrixIdentitiy._11 = 1.0f; 
matrixIdentitiy._22 = 1.0f; 
matrixIdentitiy._33 = 1.0f; 
matrixIdentitiy._44 = 1.0f; 

pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy); 
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy); 
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy); 



pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0); 
pd3dDevice->BeginScene(); 

pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); 
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE); 

pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex)); 
pd3dDevice->SetFVF(Vertex::format); 
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); 

pd3dDevice->EndScene(); 
pd3dDevice->Present(NULL, NULL, NULL, NULL); 
+0

Dies ist keine Antwort, es ist ein Teil der Frage! Der Text sollte in der Frage bearbeitet und die Antwort gelöscht werden. – unwind

+0

Einverstanden, aber es gibt keinen Link zum Löschen. –