Ich bin ein Neuling im modernen OpenGL. Ich bin mit der unmittelbaren OpenGL-Methodik vertraut, habe aber noch nie ernsthaft mit VBOs gearbeitet. Meine Frage betrifft die Animation. Im Sofortmodus müssen Sie zum Erzielen einer Animation nur verschiedene Scheitelpunktpositionen (aus Keyframes interpoliert) im Objektraum streamen.
Wie wird dies in nicht sofortigem OpenGL erreicht? Offensichtlich wird das Hochladen neuer VBO-Daten für jeden Frame den Grafikbus sicher belasten. Ich habe keine Literatur über die moderne Art und Weise gefunden, dies zu tun. Als ich darüber nachdachte, kam ich zu mehreren Optionen:
- Attribute: Animation als 3D-Offset. Für jeden Frame wird für jeden Scheitelpunkt ein anderes (möglicherweise interpoliertes) Versatzattribut übergeben, das bei jedem Keyframe auf denselben Scheitelpunkt angewendet wird.
- Indizes: Speichern von Keyframes als absolute Eckpunkte und Zugriff auf diese durch Indizierung unter Verwendung eines anderen Satzes von Eckpunkten für jeden Keyframe. Ich finde diesen Ansatz unmöglich, da Sie nicht auf benachbarte Keyframes zugreifen können und daher nicht zwischen ihnen interpolieren können. Auch scheint eine schlechte Idee für prozedurale Animation.
- Textur: Das mag sehr dehnbar sein, klingt aber nach einer guten Lösung für mich. Auch hier wird die Animation als xyz-Versatz für jeden Scheitelpunkt betrachtet. Jeder Keyframe kann in einer 1D-Textur gespeichert werden, in der die Dimension vertexID zugeordnet ist. Wenn ich mich nicht irre, können Sie in OpenGL 4.0 von jedem Shader aus auf Texturen zugreifen, sodass Sie diese Textur aus dem Vertex-Shader lesen und jede Vertex-Transformation anwenden können. Eine 2D-Textur kann mehrere Frames enthalten. Sie führen weiterhin eine Interpolation durch (und wenn die Interpolation für Texturen außerhalb des Fragment-Shaders funktioniert, bei denen ich mir nicht sicher bin, können Sie kostenlos linear interpolieren!) Dies kann ohne großen Aufwand auf komplexere Animationssysteme wie die Knochenanimation angewendet werden.
Überdenke ich das? Kann jemand etwas Licht ins Dunkel bringen?