Есть несколько аспектов этой проблемы. Во-первых, как вы рисуете свои 10000 блоков? Вы действительно рисуете их как 10000 отдельных объектов? Если это так, то это почти наверняка ваша горлышко бутылки, а не отсутствие выбраковки прикуса. Вы должны сгруппировать эти блоки в меньшее количество ячеек (возможно, несколько тысяч на ячейку), чтобы уменьшить количество вызовов отрисовки.
Что касается вашего фактического вопроса, есть три типа выбраковки окклюзии, которые приходят на ум.
1) Блоки за пределами области видимости. Это означает блоки, которые находятся позади вас или двух сторон. Ogre уже удаляет их через отбор вида фрустума.
2) Блоки, которые находятся «под землей» или полностью окружены другими блоками, поэтому их никогда нельзя увидеть под любым углом. Вы можете определить их, посмотрев на соседние блоки. Если они все твердые, ваш блок скрыт. Графический процессор никогда не должен слышать об этих блоках - они должны быть пропущены, когда вы строите сетку, которая представляет вашу поверхность.
3) Блоки, которые находятся на поверхности и могут быть видны с некоторых позиций на уровне, но которые в настоящее время скрыты холмом (или чем-то еще). Это самый сложный случай, к которому я сам не обращался, но есть большая вероятность, что для этого случая можно использовать аппаратные запросы окклюзии.
Это бесстыдный плагин, но у меня есть довольно зрелая библиотека, которую несколько человек используют для разработки клонов Minecraft, в том числе некоторые, использующие Ogre. Вы определяете содержимое тома, и он генерирует поверхностную сетку, которую вы затем можете визуализировать. Вот домашняя страница:
http://www.thermite3d.org/
А вот видео чужого проекта, который его использует:
http://www.youtube.com/watch?v=Jju6WRPEK7o
Если у вас есть 10000 отдельных объектов, узким местом может быть примитивное количество, а не вершина, многоугольник или заливка. Выпекайте свои объекты в меньшее количество объектов с более высокими полигонами для скорости.
У Minecraft есть концепция блоков кубов, но я не могу найти ссылку на данный момент.
Вот также мои эксперименты по рисованию тонн кубиков с использованием различных техник. Не включает выпечки (пока).
источник
Я создаю массив блоков, но перед созданием вершин запускаю подпрограмму UpdateBlockVisiblility.
Подпрограмма просто проверяет соседей по блоку и обновляет видимый логический блок Blocks соответственно.
Тогда я создаю вершины для лица, только если оно видно! Просто :)
источник