Я хочу реализовать средство просмотра временных рядов, которое позволяет пользователю масштабировать и плавно перемещаться.
Ранее я уже работал в режиме непосредственного запуска opengl, но сейчас это не рекомендуется в пользу VBO.Все примеры VBO, которые я могу найти, хранят координаты XYZ каждой и каждой точки.
Я подозреваю, что мне нужно хранить все мои данные в VRAM, чтобы получить частоту кадров во время панорамирования, которую можно назвать "гладкой", но у меня есть только данные Y (зависимая переменная).X - независимая переменная, которая может быть рассчитана по индексу, а Z - постоянная.Если мне нужно сохранить X и Z, тогда мои требования к памяти (размер буфера и передача блока CPU-> GPU) утроятся.И у меня есть десятки миллионов точек данных, через которые пользователь может панорамировать, поэтому использование памяти будет нетривиальным.
Существует ли какой-либо метод для рисования 1-D вершинымассив, где индекс используется в качестве другой координаты, или для хранения одномерного массива (возможно, в текстуре?) и использования программы шейдера для генерации 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[]
.