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.


Anmelden zum Antworten