OpenGL: оптимальный способ нарисовать среду из массива высоты?

Поэтому я пишу программу openGL с картографированием высоты, чтобы создать трехмерную внешнюю среду. Как и при любом отображении высоты, каждая точка находится на одинаковом расстоянии от своего соседа по оси x&z, но ось y отличается для каждой вершины в зависимости от карты высот, считываемой программой.

До сих пор моя программа хранит чтения в карте высот и сохраняет их в массиве высот y, равных по размеру (image_width)*(image_height). Мой вопрос заключается в том, какой самый эффективный способ нарисовать окружение четырехугольников с учетом этих данных?

Я думаю, что использование glDrawArrays каким-то образом является ответом, но ни один режим не будет работать с данными на начальном этапе. Например, я мог бы использовать GL_TRIANGLE_STRIP, если мой массив данных чередуется между строками и если я остановил каждую полосу в конце столбца, однако для этого потребуется массив данных, отправленный в glDrawArrays, для хранения значений из каждой строки несколько раз. Это также потребовало бы размера массива x3 от моего исходного массива, учитывая, что исходный массив хранит только значение y. Но, безусловно, указание каждого квадрата каждого кадра с учетом данных не будет эффективным вообще?

1 ответ

Решение

Самый простой (хотя и не обязательно самый эффективный с точки зрения скорости или памяти) состоит в том, чтобы сгенерировать два треугольника для каждого четырехугольника и загрузить их в графический процессор как один VBO.

Как вы уже указали, это означает, что у вас в три раза больше данных по сравнению с самой картой высот. (Следует использовать индексный буфер, чтобы не было повторяющихся вершин).

Это хороший учебник IMHO, охватывающий этот подход: http://3dgep.com/?p=1116

Другой метод заключается в использовании треугольных полос и связывании каждого ряда местности с использованием вырожденных треугольников, чтобы у вас был только один вызов отрисовки. Тем не менее память все еще имеет накладные расходы.

В зависимости от того, насколько вы опытны в OpenGL (и насколько современна ваша видеокарта), вы можете взглянуть на шейдеры тесселяции, которые обходят вышеупомянутые проблемы, напрямую используя "текстуру" карты высот:

http://codeflow.org/entries/2010/nov/07/opengl-4-tessellation/

Другие вопросы по тегам