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)));

Обратите внимание, что этот метод требует, чтобы вы всегда имели все уровни в хранилище. Это может, в зависимости от ваших потребностей, не быть тем, что вы хотите.

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