2014-12-06 2 views
0

Я реализую приложение QT OpenGL со «временной шкалой», которое позволяет пользователю сглаживать некоторую анимированную трехмерную геометрию, то есть очистка временной шкалы должна инициировать события, которые вызывают повторное связывание данных VBO, поэтому что он перерисовывается должным образом.Быстрая модификация буферов VAO OpenGL

Я мог бы повторно привязать только разделы памяти, которые изменились между двумя временными точками на временной шкале (агрегируя все дельта между двумя временными точками), но это кажется довольно дорогостоящим. Было бы достаточно наивно просто повторно привязать все данные VBO к событию изменения времени и отслеживать все данные VBO для каждого кадра в памяти?

+1

См. Также: https://www.opengl.org/wiki/Buffer_Object_Streaming –

ответ

0

(я предполагаю, что здесь, что вы оживляющий вершин индивидуально вместо того, чтобы использовать кости или что-то. Ситуация с костями будет похожа.)

Проблема, имея полную копию VBO для каждого кадр - тонна памяти.

В идеале, то, что вы хотели бы иметь, - это список ключевых кадров, каждый из которых имеет время, вершины, которые анимируются ключевым кадром в виде списка векторов + смещений и данных интерполяции. То, что вы отправили бы в вершинный шейдер, - это «до» VBO, а «после» VBO - альфа. Затем вершинный шейдер выполняет интерполяцию.

Таким образом, когда вы вычистить до точки, вы просто должны glBufferSubData частей до и после РВО, которые отличаются (то есть, каждый ключевой кадр, который вы прошли, если таковые имеются) и glUniform1f альфа. Вы можете сделать некоторые эвристики, чтобы избежать чрезмерных вызовов glBufferSubData, то есть повторно отправить весь буфер, когда вы будете делать больше, чем, скажем, 5 вызовов.

+0

Что делать, если на каждом кадре имеется ключевой кадр? Я не совсем работаю с данными анимации, больше похожую на временную последовательность FMRI. – ejang

Смежные вопросы