Models mit verschiedenen Materialien rendern
Verfasst: 04.02.2016, 13:41
Hallo Freunde der Sonne.
Ich hätte gerne eure Meinung zu einem Problem/Effekt.
Ich rendere mit OpenGL 3.3 (core) Models.
Ein Model kann aus ja Faces mit verschiedenen Materialien (z.Z. Nur Farb-Textur) bestehen. Diese werden (nach Material) sortiert gerendert, um DrawCalls/Context Switches zu sparen.
Zur Zeit (1) habe ich ein Vertex Array Object [VAO]; daran geknotet ist ein Vertex Buffer Object[VBO] mit allen Vertices des Modells. Für das Rendering der verschiedenen Sektionen (Materialgruppen) benutze übertrage ich per DrawCall die entsprechenden Indices, um nur die Vertices zu rendern, die auch zu Faces des aktuellen Materials zu gehören (glDrawElementsInstanced[ARB]). Nun frage ich mich, ob das nicht noch etwas ineffizient ist. Gerade bei Großer Anzahl der Objekte muss ich ja immernoch die Indices übertragen.
Ich habe mir überlegt, dass es vielleicht praktischer ist, ohne Indices zu rendern (2) und die Vertices einfach in der richtigen Reihenfolge ein Vertex Array Object (VAO) zu stopfen und dieses dann ohne Indices komplett zu rendern (mit glDrawArraysInstanced[ARB]).
Alternativ (3) könnte ich auch Verschiedene Vertex Buffer Objects mit den Vertices der jeweiligen Materialgruppe vorhalten und dieses vorm Rendern an ein globales Vertex Array Object binden.
Ich ahne aber, dass die letzte Methode (3) die unpraktischste ist. Ich tendiere im Moment dazu, so etwas wie (2) zu implementieren. Also alles Vertices, die zu einer Materialgruppe eines Models gehören (also nennen wirs mal ein „Mesh“) komplett seinen eignenen VAO + VBO zu spendieren.
Das würde mir das Übertragen der Indices beim DrawCallen ersparen, würde aber mit sich bringen, dass manche Vertices mehrfach im VBO/A auftreten, da sie an in der korrekten Reihenfolge für Render-Primitive (TRIANGLES, TRIANGLE_STRIPS) im Buffer liegen müssen.
Weiterhin habe ich ein extra VBA für jedes Teil-Model/Mesh. Ich kannn nicht einschätzen, wie groß der Memory-Footprint dieser Strukturen ist. Verschwendet das unnötig (Video-/Treiber-)speicher oder kann man das getrost vernachlässigen?
Was ist der günstigste Weg? Was ist da Best Practice?
Ich hoffe, ich habe hier mein Problem/Frage nicht zu wirr dargestellt… :-/
Danke im Voraus,
Jens
Ich hätte gerne eure Meinung zu einem Problem/Effekt.
Ich rendere mit OpenGL 3.3 (core) Models.
Ein Model kann aus ja Faces mit verschiedenen Materialien (z.Z. Nur Farb-Textur) bestehen. Diese werden (nach Material) sortiert gerendert, um DrawCalls/Context Switches zu sparen.
Zur Zeit (1) habe ich ein Vertex Array Object [VAO]; daran geknotet ist ein Vertex Buffer Object[VBO] mit allen Vertices des Modells. Für das Rendering der verschiedenen Sektionen (Materialgruppen) benutze übertrage ich per DrawCall die entsprechenden Indices, um nur die Vertices zu rendern, die auch zu Faces des aktuellen Materials zu gehören (glDrawElementsInstanced[ARB]). Nun frage ich mich, ob das nicht noch etwas ineffizient ist. Gerade bei Großer Anzahl der Objekte muss ich ja immernoch die Indices übertragen.
Ich habe mir überlegt, dass es vielleicht praktischer ist, ohne Indices zu rendern (2) und die Vertices einfach in der richtigen Reihenfolge ein Vertex Array Object (VAO) zu stopfen und dieses dann ohne Indices komplett zu rendern (mit glDrawArraysInstanced[ARB]).
Alternativ (3) könnte ich auch Verschiedene Vertex Buffer Objects mit den Vertices der jeweiligen Materialgruppe vorhalten und dieses vorm Rendern an ein globales Vertex Array Object binden.
Ich ahne aber, dass die letzte Methode (3) die unpraktischste ist. Ich tendiere im Moment dazu, so etwas wie (2) zu implementieren. Also alles Vertices, die zu einer Materialgruppe eines Models gehören (also nennen wirs mal ein „Mesh“) komplett seinen eignenen VAO + VBO zu spendieren.
Das würde mir das Übertragen der Indices beim DrawCallen ersparen, würde aber mit sich bringen, dass manche Vertices mehrfach im VBO/A auftreten, da sie an in der korrekten Reihenfolge für Render-Primitive (TRIANGLES, TRIANGLE_STRIPS) im Buffer liegen müssen.
Weiterhin habe ich ein extra VBA für jedes Teil-Model/Mesh. Ich kannn nicht einschätzen, wie groß der Memory-Footprint dieser Strukturen ist. Verschwendet das unnötig (Video-/Treiber-)speicher oder kann man das getrost vernachlässigen?
Was ist der günstigste Weg? Was ist da Best Practice?
Ich hoffe, ich habe hier mein Problem/Frage nicht zu wirr dargestellt… :-/
Danke im Voraus,
Jens