VertexFormat Strukturen



  • Hi

    Ich programmiere zur Zeit eine GameEngine mit OpenGL ES für das iPhone. Nun bin ich an der VertexBuffer Klasse dran. In der VertexBuffer Klasse befindet sich eine Renderfunktion. Für die Engine habe ich natürlich mehrere Vertexformate definiert. Ich speichere die Vertices mit einem void-Zeiger. In der Renderfunktion verlangt OpenGL nun einen Zeiger auf die x-Position des ersten Vertex sowie einen Zeiger auf die r-Farbkomponente des ersten Vertex, für andere Vertexformate noch weitere Zeiger. Zur Zeit habe ich allerdings einen sehr aufwendigen Lösungsweg.

    Hier ist ein Codeausschnitt:

    struct VEVertexXYZ {
        float Position[3];
        float Color[4];
    };
    
    struct VEVertexNormal {
        float Position[3];
        float Normal[3];
    };
    
    struct VEVertexTex {
        float Position[3];
        float tu[2];
        float tv[2];
    };
    
    GLsizei stride;
    
    const GLvoid* pCoords;
    const GLvoid* pColors;
    
    switch (m_vertexFormat) {
         case VEVertexFormatXYZ:
            pCoords = &static_cast<VEVertexXYZ*>(m_pData)[0].Position[0];
            pColors = &static_cast<VEVertexXYZ*>(m_pData)[0].Color[0];
            stride = sizeof(VEVertexXYZ);
            break;
    
         case VEVertexFormatNormal:
            pCoords = &static_cast<VEVertexNormal*>(m_pData)[0].Position[0];
            pColors = &static_cast<VEVertexNormal*>(m_pData)[0].Color[0];
            stride = sizeof(VEVertexNormal);
            break;
    
         case VEVertexFormatTex:
            pCoords = &static_cast<VEVertexTex*>(m_pData)[0].Position[0];
            pColors = &static_cast<VEVertexTex*>(m_pData)[0].Color[0];
            stride = sizeof(VEVertexTex);
            break;
    
         default:
            break;
    }
    

    Hätte jemand einen besseren Lösungsvorschlag? Besonders in einer Renderfunktion, welche oftmals aufgerufen wird, wäre es gut eine schnelle Renderfunktion zu programmieren.

    LG Patrick



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    wenn du schnell sein willst, wirst du wohl VBOs benutzen und diese verlangen keine absolute addresse, sondern offsets.

    kannst dir also eine structur anlegen ala

    struct layout
    {
    int pos;
    int normal;
    int uv;
    int stride;
    };
    
    layout layouts[VECount]={{
    &static_cast<VEVertexXYZ*>(0)[0].Position[0],
    &static_cast<VEVertexXYZ*>(0)[0].Color[0],
    0,
            stride = sizeof(VEVertexXYZ)},
    {...},
    {...}};
    

    und beim zeichnen machst du simplerweise

    {
    layout* pLayout=layouts[m_vertexFormat];
    glVertexPointer(.... pLayout->pos);
    }
    

    sorry, keine zeit es zu beautify, aber ich denke der gedanke kommt rueber.

    uebrigens, draw funktion in der mesh klasse? wieso nicht auch in der textur klasse? und was passiert wenn du ein fullscreen rect zeichnen willst z.b. fuer blur, ein mesh mit 3verticen erstellen? 😉


Anmelden zum Antworten