Я хочу реализовать средство просмотра времени, которое позволяет пользователю масштабировать и плавно панорамировать.Использовать индекс в качестве координаты в OpenGL
Раньше я делал немедленный режим opengl, но теперь он устарел в пользу VBOs. На всех примерах VBOs я могу найти координаты XYZ для хранения каждой точки.
Я подозреваю, что мне нужно сохранить все данные в VRAM, чтобы получить частоту кадров во время панорамирования, которую можно назвать «гладкой», но у меня есть только данные Y (зависимая переменная). X - независимая переменная, которая может быть вычислена из индекса, а Z - постоянной. Если мне нужно хранить X и Z, тогда мои требования к памяти (как размер буфера, так и передача блока CPU-> GPU) утроятся. И у меня есть десятки миллионов точек данных, через которые пользователь может панорамировать, поэтому использование памяти будет нетривиальным.
Есть ли какой-либо метод для рисования 1-D вершинного массива, где индекс используется в качестве другой координаты или хранения 1-мерного массива (возможно, в текстуре?) И использования шейдерной программы для генерации XYZ? У меня создается впечатление, что мне нужен простой шейдер в любом случае в рамках новой модели конвейера с фиксированной функциональностью, чтобы реализовать масштабирование и перевод, поэтому, если бы я мог объединить генерацию координат X и Z и масштабирование/перевод Y, которые были бы идеально.
Возможно ли это? Вы знаете какой-нибудь пример кода, который делает это? Или вы можете хотя бы дать мне псевдокод, говорящий, что GL выполняет вызов в каком порядке?
Спасибо!
EDIT: Для того, чтобы убедиться, что это ясно, вот эквивалентный код в непосредственном режиме, и код массива вершин:
// 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[]
.
Спасибо. Я думаю, я не понимаю, как OpenGL знает, что я хочу, чтобы 'coord_X' означал индекс вершины. –
@Ben Voigt: Я пропустил это изначально, извините :) Ответ теперь исправлен (с использованием gl_VertexID). – kvark
Спасибо, теперь это намного больше. И я мог бы использовать 'glDrawArrays', чтобы сделать это en-masse? Я спрашиваю, потому что [manpage для 'glDrawArrays'] (http://www.opengl.org/sdk/docs/man/xhtml/glDrawArrays.xml) говорит:« Если GL_VERTEX_ARRAY не включен, геометрические примитивы не генерируются. " Не распространяется ли это в мире OpenGL 3, где вершинные местоположения генерируются шейдером? –