Я реализую приложение QT OpenGL с «временной шкалой», которая позволяет пользователю просматривать некоторую анимированную трехмерную геометрию — то есть очистка временной шкалы должна вызывать события, которые вызывают повторное связывание данных VBO для правильного их перерисовки.
Я мог бы повторно связать только те участки памяти, которые изменились между двумя временными точками на временной шкале (объединяя все дельты между двумя временными точками), но это кажется довольно дорогим. Достаточно ли было бы наивно просто связывать все данные VBO в событии изменения момента времени и отслеживать все данные VBO для каждого кадра в памяти?
(Я предполагаю, что вы анимируете вершины индивидуально, а не используете кости или что-то в этом роде. Ситуация с костями будет похожей.)
Проблема в том, что полная копия VBO для каждого кадра — это тонна памяти.
В идеале вы хотели бы иметь список ключевых кадров, каждый из которых имеет время, вершины, которые анимируются ключевым кадром в виде списка векторов + смещений и данных интерполяции. То, что вы бы отправили вершинному шейдеру, это «до» VBO, а «после» VBO — альфа. Затем вершинный шейдер выполняет интерполяцию.
Таким образом, когда вы чистите точку, вам просто нужно glBufferSubData
части до и после VBO, которые отличаются (т. е. каждый ключевой кадр, который вы передали, если есть) и glUniform1f
альфа. Вы можете сделать некоторую эвристику, чтобы избежать чрезмерного glBufferSubData
звонки, т.е. повторно отправлять весь буфер, когда вы будете делать больше, чем, скажем, 5 звонков.