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.