Использовать индекс как координату в OpenGL

Я хочу реализовать средство просмотра временных рядов, которое позволяет пользователю увеличивать масштаб и плавно панорамировать.

Раньше я использовал несколько немедленных режимов 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 [] .

5
задан Ben Voigt 9 February 2011 в 21:54
поделиться