OpenGL реализует уровень детализации
Я хотел бы реализовать алгоритм уровня детализации для моих полигонов в моем 3D-движке. Я получил следующее:
1. Объект с несколькими количествами полигонов, например:
House:
1. -Entity1: 10000 polygons viewrange[0,100]
2. -Entity1: 5000 polygons viewrange[100,300]
3. -Entity1: 800 polygons viewrange[300,1000]
4. -Entity1: 100 polygons viewrange[1000,infinity]
Обычно я создаю новый VAO, включая VBO для каждого субъекта, но есть ли более разумный способ реализации этого? Могу ли я использовать только один VAO и настроить уровень детализации, изменив буфер индексов?
Я создал пример. Сейчас я имею дело с сетками ландшафта, и мне нужно применить LoD к ним:
Пример для буфера разных индексов, но как мне их поменять? Это эффективно?
Каков наилучший способ реализации LoD в OpenGL? Мне нужно несколько VAO или достаточно одного VAO?
1 ответ
Вы можете хранить как данные, так и информацию об индексировании в одном VAO. Если вы сложите все индексы в одном буфере, вы можете настроить уровень, который вы хотите нарисовать, указав начальный индекс и количество индексов в команде рисования.
Для вашего примера вы должны создать индексный буфер с 30 индексами, где индекс 0-5 для уровня 1, 6-29 для уровня 2. Затем вы можете нарисовать уровень 1, вызвав:
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
и уровень 2 по телефону:
glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_INT, (void*)(6 * sizeof(GLuint)));
Обратите внимание, что этот метод требует, чтобы вы всегда имели все уровни в хранилище. Это может, в зависимости от ваших потребностей, не быть тем, что вы хотите.