Я хочу реализовать средство просмотра временных рядов, которое позволяет пользователю увеличивать масштаб и плавно панорамировать.
Раньше я использовал несколько немедленных режимов opengl, но теперь он устарел в пользу VBO. Все примеры VBO, которые я могу найти, хранят координаты XYZ каждой точки.
Я подозреваю, что мне нужно хранить все мои данные во VRAM, чтобы получить частоту кадров во время панорамирования, которую можно назвать «плавной», но я иметь только данные Y (зависимая переменная). X - независимая переменная, которую можно вычислить по индексу, а Z - постоянная величина. Если мне нужно сохранить X и Z, тогда мои требования к памяти (как размер буфера, так и передача блоков CPU-> GPU) утроятся. И у меня есть десятки миллионов точек данных, по которым пользователь может перемещаться, поэтому использование памяти будет нетривиальным.
Есть ли метод рисования одномерного массива вершин, где индекс используется в качестве другой координаты, или сохранения одномерного массива (возможно, в текстуре?) И использования программы шейдера для генерации XYZ ? У меня сложилось впечатление, что мне в любом случае нужен простой шейдер в новой модели конвейера без фиксированных функций для реализации масштабирования и трансляции, поэтому, если бы я мог объединить генерацию координат X и Z и масштабирование / преобразование Y, это было бы идеально.
Возможно ли такое? Вы знаете какой-нибудь пример кода, который это делает? Или вы можете хотя бы дать мне какой-нибудь псевдокод, говорящий, какие функции GL вызывать в каком порядке?
Спасибо!
РЕДАКТИРОВАТЬ: Чтобы убедиться, что это понятно, вот эквивалентный код немедленного режима и код массива вершин:
// immediate
glBegin(GL_LINE_STRIP);
for( int i = 0; i < N; ++i )
glVertex2(i, y[i]);
glEnd();
// vertex array
struct { float x, y; } v[N];
for( int i = 0; i < N; ++i ) {
v[i].x = i;
v[i].y = y[i];
}
glVertexPointer(2, GL_FLOAT, 0, v);
glDrawArrays(GL_LINE_STRIP, 0, N);
обратите внимание, что v []
вдвое больше y []
.