Лучший способ конвертировать OpenGL методы непосредственного рендеринга в VBO?

Я написал для себя небольшой вспомогательный класс, содержащий полезные методы для быстрой и простой визуализации линий, квадратов, кубов и т. Д. В OpenGL. До сих пор я использовал почти полностью немедленный режим, поэтому я мог сосредоточиться на изучении других аспектов OpenGL. Кажется целесообразным переключиться на использование VBO. Тем не менее, я хочу сохранить большую часть той же функциональности, которую я использовал, например, мой служебный класс. Есть ли хороший метод преобразования этих простых вызовов режима в универсальную систему VBO?

Я использую LWJGL.

1 ответ

Решение

Преобразовав свой собственный код из блоков begin..end, а также научив других, я рекомендую это.

Я предполагаю, что ваш служебный класс в основном статические методы, проведите линию от этой точки до этой точки.

Первым шагом является создание каждой отдельной операции рисования VBO для каждого атрибута. Замените свой блок glBegin..glEnd кодом, который создает массив (фактически ByteBuffer) для каждого атрибута вершины: координат, цветов, текстовых координат и т. Д. После того, что раньше было glEnd, скопируйте ByteBuffers в VBO с помощью glBufferData. Затем установите атрибуты с помощью фрагментов вызовов glEnableClientState, glBindBuffer, glVertex|Color|whatPointer. Вызовите glDrawArrays, чтобы на самом деле что-то нарисовать, и, наконец, восстановите состояние клиента и удалите VBO.

Теперь, это не хороший код OpenGL и ужасно неэффективный и расточительный. Но это должно сработать, это довольно просто написать, и вы можете менять один метод за раз.

И если вам не нужно много рисовать, то современные графические процессоры настолько быстры, что, возможно, вам все равно, что это неэффективно.

Второй шаг - начать повторное использование VBO. Пусть ваш класс создаст одно VBO для каждого возможного атрибута во время инициализации или первого использования. Код чертежа по-прежнему создает массивы данных ByteBuffer и копирует их, но не удаляет VBO.

Третий шаг, если вы хотите перейти в OpenGL 4 и используете шейдеры, это заменить glVertexPointer на glVertexAttribPointer(0, glColorPointer на glVertexAttribPointer(1 и т. Д.). Вы также должны создать объект массива Vertex вместе с VBO во время инициализации. (Вам все равно придется включать / отключать указатели атрибутов по отдельности в зависимости от того, нужны ли каждой операции рисования цвета, текс-координаты и т. Д.)

И последний шаг, который потребует изменений в других местах вашей программы (программ), состоит в том, чтобы перейти к трехмерным "объектам", а не к методам. Ваш служебный класс больше не будет содержать методы рисования. Вместо этого вы создаете объект линии, квадрата или куба и рисуете его. Каждый из этих объектов (вероятно) будет иметь свои собственные VBO. Это больше работы, но действительно окупается в общем случае, когда большая часть вашей трехмерной геометрии не меняется от кадра к кадру. Но опять же, вы можете начать с более "расточительного" подхода - заменить каждый вызов метода для рисования линии от P1 до P2 чем-то вроде l = new Line3D(P1, P2); l.draw().

Надеюсь это поможет.

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