Я пишу приложение, которое загружает вершины двух сеток (которые служат ключевыми кадрами) в два отдельных плавающих буфера данных OpenGL. Две сетки имеют одинаковое количество вершин.
Я хотел бы вычислить промежуточные кадры, используя линейную интерполяцию между этими двумя буферами (где я могу указать вес интерполяции в качестве значения между 0 и 1). В настоящее время я выполняю интерполяцию на процессоре, но я хотел бы перенести вычисления в графический процессор для более быстрого вычисления промежуточных кадров.
Есть ли способ сделать это, используя только OpenGL (т.е. не OpenCL)? Если так, то как?
Предполагая, что вершины хранятся в одном и том же порядке в обоих буферах, вы можете просто привязать каждый из буферов к атрибуту в вершинном шейдере. В сочетании с униформой, которая управляет интерполяцией (назовем ее t), которая идет от 0 (только первый буфер) до 1 (только второй буфер), вы можете выполнить линейную интерполяцию перед записью в gl_Position
, Шейдер может выглядеть примерно так:
in vec4 buffer1; //Bind buffer1 to this attribute
in vec4 buffer2; //Bind buffer2 to this attribute
uniform float t; //Interpolation parameter between 0 and 1
void main()
{
gl_Position = (1 - t) * buffer1 + t * buffer2;
}
Других решений пока нет …