glDrawElements relativ nutzlos?



  • Hi,

    ich habe gerade mal ein bisschen in altem Source-Code rumgestöbert und meinen alten .obj Loader gefunden. .obj ist grundsätzlich ja Index-basiert, heißt zu erst werden alle Punkte, Texturkoordinaten und Normalen definiert, und dann die "faces" die quasi jeweils die verschiedenen Daten indexieren. Okay. Nun könnte man ja glauben, dass glDrawElements sich dafür eignen würde. Dem scheint aber nicht so zu sein, denn dort kann man nur "vollständige" Vertices indexieren. Das bringt aber nichts, weil man Punkte/Normalen/Textur-Koordinaten unterschiedlich indexieren muss. Ist glDrawElements also überhaupt zu irgendetwas gut, was "übliche" Models angeht? (Also mit Texturkoordinaten.) Und falls nicht, wozu benutzt man es dann?
    Zur Verdeutlichung:

    #
    # object Box001
    #
    
    v  -1.9032 -1.7841 0.0000
    v  -1.9032 2.3628 0.0000
    v  2.5092 2.3628 0.0000
    v  2.5092 -1.7841 0.0000
    v  -1.9032 -1.7841 2.0215
    v  2.5092 -1.7841 2.0215
    v  2.5092 2.3628 2.0215
    v  -1.9032 2.3628 2.0215
    # 8 vertices
    
    vn 0.0000 0.0000 -1.0000
    vn 0.0000 0.0000 1.0000
    vn 0.0000 -1.0000 0.0000
    vn 1.0000 0.0000 0.0000
    vn 0.0000 1.0000 0.0000
    vn -1.0000 0.0000 0.0000
    # 6 vertex normals
    
    vt 1.0000 0.0000 0.0000
    vt 1.0000 1.0000 0.0000
    vt 0.0000 1.0000 0.0000
    vt 0.0000 0.0000 0.0000
    # 4 texture coords
    
    g Box001
    usemtl wire_153228153
    s 2
    # Hier werden unterschiedliche Indices kombiniert!
    f 1/1/1 2/2/1 3/3/1 
    f 3/3/1 4/4/1 1/1/1 
    s 4
    f 5/4/2 6/1/2 7/2/2 
    f 7/2/2 8/3/2 5/4/2 
    s 8
    f 1/4/3 4/1/3 6/2/3 
    f 6/2/3 5/3/3 1/4/3 
    s 16
    f 4/4/4 3/1/4 7/2/4 
    f 7/2/4 6/3/4 4/4/4 
    s 32
    f 3/4/5 2/1/5 8/2/5 
    f 8/2/5 7/3/5 3/4/5 
    s 64
    f 2/4/6 1/1/6 5/2/6 
    f 5/2/6 8/3/6 2/4/6 
    # 12 faces
    


  • glDrawElements() hat nicht nur Sinn, sondern ist so ziemlich die mit Abstand effizienteste Art um allgemeine, zusammenhängende Meshes zu rendern (Stichwort Vertex Cache). Aber die GPU unterstützt keine separaten Indices für einzelne Attribute. Du musst dein .obj eben in ein entsprechendes Format umwandeln. Einfachster Weg: std::unordered_map... 😉



  • dot schrieb:

    glDrawElements() hat nicht nur Sinn, sondern ist so ziemlich die mit Abstand effizienteste Art um allgemeine, zusammenhängende Meshes zu rendern

    Das erschien mir auch relativ intuitiv, nur bleibt halt die Frage wie viel es wirklich bringt. Wenn ich mir das Model da so ansehe, kann ich ja nur dann sinnvoll Mehrfachdaten vermeiden, wenn sich eine Konfiguration wiederholt. Bei dem oben geposteten Beispiel kann man somit die Vertex-Zahl von 36 auf 24 bringen. Na ja, wenig beeindruckend irgendwie. Ich kann's ja mal mit einem etwas komplexeren Model versuchen.


Log in to reply