Problem bei Flexible Vertex Format (D3D)
-
Hallo Leute!
Ich habe ein Problem und zwar wollte ich eigenes FVF anlegen und dann ein durchsichtiges Rechteck mit Textur anzeigen lassen.// The 3-D vertex format and descriptor typedef struct { FLOAT x, y, z; // 3-D coordinates FLOAT u, v; // Texture coordinates D3DCOLOR diffuse; // Color + Diffuse } sVertex; #define VERTEXFVF (D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_DIFFUSE) sVertex Verts[4] = { { -100.0f, 100.0f, 0.0f, 0.0f, 0.0f,D3DCOLOR_RGBA(255,255,255,200) }, { 100.0f, 100.0f, 0.0f, 1.0f, 0.0f,D3DCOLOR_RGBA(255,255,255,200) }, { -100.0f, -100.0f, 0.0f, 0.0f, 1.0f,D3DCOLOR_RGBA(255,255,255,200) }, { 100.0f, -100.0f, 0.0f, 1.0f, 1.0f,D3DCOLOR_RGBA(255,255,255,200) } };Wenn ich das Rechteck aber rendern lasse, bekomme ich ein komplett schwarzes Rechteck geliefert...
Vorher sah der Code so aus (also nur Textur, ohne Farbe und ohne alpha blending etc.)typedef struct { FLOAT x, y, z; // 3-D coordinates FLOAT u, v; // Texture coordinates } sVertex; #define VERTEXFVF (D3DFVF_XYZ | D3DFVF_TEX1) sVertex Verts[4] = { { -100.0f, 100.0f, 0.0f, 0.0f, 0.0f }, { 100.0f, 100.0f, 0.0f, 1.0f, 0.0f }, { -100.0f, -100.0f, 0.0f, 0.0f, 1.0f }, { 100.0f, -100.0f, 0.0f, 1.0f, 1.0f } };Dann in der Renderschleife habe ich Zeile 13-15 und Zeile 23 hinzugeschrieben
if(SUCCEEDED(g_pD3DDevice->BeginScene())) { // Create and set the world transformation matrix // Rotate object along Z-axis D3DXMatrixRotationZ(&matWorld, (float)timeGetTime() / 1000.0f); g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld); // Set the vertex stream, shader, and texture g_pD3DDevice->SetStreamSource(0, g_pVB, 0, sizeof(sVertex)); g_pD3DDevice->SetFVF(VERTEXFVF); g_pD3DDevice->SetTexture(0, g_pTexture); //Set Alpha Blending g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); // Draw the vertex buffer g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); // Release texture g_pD3DDevice->SetTexture(0, NULL); g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); // End the scene g_pD3DDevice->EndScene(); }Und nun Frage ich mich, wieso bekomme ich nur nen schwarzes Rechteck? Habe ich da was beim FVF falsch gemacht?
-
hast du eine Textur mit Alphakanal angelegt?
Also so ein Format: "A8R8G8B8" oder ähnlich?
ansonsten versuch mal die Alphawerte von Hand zu setzen!hoffentlich konnte ich Helfen
muli
-
die textur-koordinaten werden in der vertex-struktur nach der farbe erwartet, deshalb wird jetzt "u" als farbe interpretiert und das ist bei allen deinen vertices 0 - also schwarz.
-
Erstmals Danke für die Antworten!
@muli was meinst du damit genau? Bin noch nicht sehr bewandert mit D3D
@hellihjb
Wieso das denn?typedef struct { FLOAT x, y, z; // 3-D coordinates FLOAT u, v; // Texture coordinates D3DCOLOR diffuse; // Color + Diffuse } sVertex; #define VERTEXFVF (D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_DIFFUSE) sVertex Verts[4] = { { -100.0f, 100.0f, 0.0f, 0.0f, 0.0f,D3DCOLOR_RGBA(255,255,255,200) }, { 100.0f, 100.0f, 0.0f, 1.0f, 0.0f,D3DCOLOR_RGBA(255,255,255,200) }, { -100.0f, -100.0f, 0.0f, 0.0f, 1.0f,D3DCOLOR_RGBA(255,255,255,200) }, { 100.0f, -100.0f, 0.0f, 1.0f, 1.0f,D3DCOLOR_RGBA(255,255,255,200) } };Wenn du dir mal sVertex genau anschaust dann wirst du sehen der 3te Teil der Struktur gehört noch zu (float z; ) Also genau die Spalte die 4 mal die 0.0f enthält.
Ich habe mal einfach die Textur aus dem Verzeichnis genommen und geschaut was dann passiert und siehe da, ich habe mein alpha blending und Farbe(Jedoch nicht die Richtige?). Wenn ich die Textur jedoch im Verzeichnis habe, bekomme ich nur das schwarze Rechteck

Wird nicht eigentlich durch
#define VERTEXFVF (D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_DIFFUSE)
auch die Reihenfolge für Koordinaten Textur etc. festgelegt? Oder werden diesen nach einer bestimmten Reihenfolge erwartet?
-
Wird nicht eigentlich durch (D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_DIFFUSE) auch die Reihenfolge für Koordinaten Textur etc. festgelegt?
wie soll das denn gehen?
die oder-verknuepfung ist kommutativ.textur-koordinaten muessen bei fvf an's ende, deine struktur muss also so aussehen:
typedef struct { FLOAT x, y, z; // 3-D coordinates D3DCOLOR diffuse; // Color + Diffuse FLOAT u, v; // Texture coordinates } sVertex;oder du machst 'ne vertexdeclaration.
-
hellihjb schrieb:
die oder-verknuepfung ist kommutativ.
Ja, steht aber eigentlich auch irgendwo in der DX Doku, was es alles für Optionen gibt und in welcher Reihenfolge sie drinstehen müssen?
-
Danke für die Antwort, jetzt klappt es!

Wäre echt gut zu wissen, wo das steht.
-
einfach immer der reihe nach.