Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Mein OpenGL ist inzwischen zwar ganz schön eingerostet (seit Vulkan zieht mich nix mehr in Richtung GL), aber bei regelmäßigen Buffer-Updates (die da wohl gemacht werden) sollte man afair eher mit sowas wie glMapBuffer arbeiten. glBufferData sollte man wenn überhaupt nur für einmalig (oder selten) statisch zu füllende Daten verwenden, das ist in einem Beispiel wohl nicht der Fall.
P.S. : Die Kommentare beinhalten noch viele Rechtschreibfehler.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Es stimmt dass man glBufferData vermeiden sollte (da das einen vollständig neuen Buffer allokiert und damit die gleichen Probleme hat wie glMapBuffer), aber glBufferSubData kann bei weitem besser sein als glMapBuffer.
glBufferSubData hat (aus Treibersicht) den Vorteil, dass das schreiben auf die Hardware asynchron passieren kann. Bei glMapBuffer muss die Verwendung des Buffers auf der GPU angehalten sein (zumindest wenn glMapBuffer als tatsächliches memory mapping implementiert wird etc.etc.). Wenn man nur glBufferSubData verwendet kann die GPU sogar für jeden Frame intern einen neuen Buffer anlegen und den alten wegschmeißen, sozusagen vollständig immutable buffer haben.
viele Grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Ich habe mal glBufferData durch glBufferSubData ersetzt, ab dann bleibt die Mesh schwarz. Wen ich es bei Vector auch noch mache, dann kommt gar keine Mesh mehr. Was verstehe ich da falsch ?
Verstehe ich das richtig, das mit glBufferData VRAM reserviert wird, und mit glBufferSubData der Inhalt des VRAM aktualisiert wird ? Ein Wermutstropfen hat glBufferSubData dennoch, man muss von Anfang an wissen, wie gross die Mesh maximal wird.
Aber ich denke ein 3D-Charakter, hat immer gleich viel Polygone, nur desen Form ändert sich.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
mathias hat geschrieben:
Verstehe ich das richtig, das mit glBufferData VRAM reserviert wird, und mit glBufferSubData der Inhalt des VRAM aktualisiert wird?
Ja. Deswegen sollte glBufferData nur einmal aufgerufen werden und bei darauf folgenden Updates nur noch glBufferSubData.
Das Problem, das dabei bleibt, ist implizite Synchronisation von GPU und CPU. Es kann also vorkommen, dass die GPU auf die CPU wartet (oder umgekehrt) und dabei nutzlos Däumchen dreht. Um das zu verhindern, kann man Double- oder Triple-Buffering anwenden, oder man nutzt Persistent Mapped Buffers (oder macht beides zugleich). Für letzteres brauchst du die Extension GL_ARB_buffer_storage oder OpenGL 4.4. Ich denke darauf bezog sich Sascha's Post mit glMapBuffer. Ich habe das selbst noch nicht gemacht, sollte ich aber unbedingt mal ausprobieren. Hier gibt es einen Artikel über das Warum und Wie.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Wenn du den Buffer jeden (oder fast jeden) Frame updatest, dann ist DYNAMIC_DRAW richtig.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Wie genau der Treiber da optimiert ist unspezifiziert. Es handelt sich lediglich um einen Hint.
viele Grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ja. Was genau (bzw. ob überhaupt) eine Implementation mit einem Hint macht bleibt ihr überlassen. Es wird also Treiber bei denen es keinen Unterschied zwischen STATIC_DRAW und DYNAMIC_DRAW gibt. Das ist einer der Nachteile der impliziten Natur von OpenGL.
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.