Подход, который я использовал в , этот рендерер уровня Minecraft , по сути, заполнен наводнением с ограниченным усечением. Части 16x16x128 разделены на части 16x16x16, каждый с VBO с соответствующей геометрией. Я начинаю заливку в сетке чанклетов на месте игрока, чтобы найти чанкеты для рендеринга. Заполнение ограничено:
- Вид усеченного
- Сплошные чанклеты - если вся сторона чанклета является непрозрачными блоками, то заливка не попадет в чанлет в этом направлении
- Направление - поток не изменит направление, например: если текущий чанклет находится к северу от исходного чаклета, не заливайте его в юг
Кажется, все в порядке. Я нахожусь на андроиде, поэтому, хотя более сложный анализ (антипорталы, как отметил Майк Дэниелс) отбросил бы больше геометрии, я уже ограничен в ЦП, так что нет особого смысла.
Я только что видел ваш ответ Алану: отбраковка - это не ваша проблема, а то, что и как вы отправляете в OpenGL, это медленно.
Что рисовать: не визуализируйте куб для каждого блока, визуализируйте грани прозрачных блоков, которые граничат с непрозрачным блоком. Рассмотрим куб 3x3x3, скажем, из каменных блоков: нет смысла рисовать центральный блок, потому что игрок не может его увидеть. Кроме того, игрок никогда не увидит грани между двумя соседними каменными блоками, поэтому не рисуйте их.
Как рисовать: Как заметил Алан, используйте VBO для пакетной геометрии. Вы не поверите, насколько быстрее они делают вещи.
Более простой подход с минимальными изменениями в существующем коде заключается в использовании списков отображения . Это то, что использует Minecraft.