Как обнаружить невидимые треугольники на экране

У меня очень простая карта местности с плитками! Все плитки одинакового размера, только разная высота (значение z)! Я могу отрендерить их нормально, но есть тысячи плиток, но не все из них отображаются на экране, а только часть (которая находится впереди обзора)! Итак, я делаю пакетный рендеринг, собираю только плитки, которые появляются на экране, а затем визуализирую их все за один вызов! Я пытаюсь использовать D3DXVec3Project для проецирования вершины из мирового пространства в пространство экрана, а затем определять, какой треугольник отображается на экране, однако это очень медленно, вызовите это для всей карты, занимающей 7 мс (около 250x250 вызовов).

Прямо сейчас я использую iso view (D3DXMatrixOrthoLH), нет камеры или глаза, когда я хочу перемещаться по карте, я просто перевожу мир!

Я думаю, что это очень распространенная проблема, с которой все движки должны сталкиваться при оптимизации, но я не могу ее найти! Это видимое обнаружение, отсечение или отсечение ...? Спасибо! Должен ли я просто визуализировать все плитки на экране и позволить DirectX автоматически обрезать нас? (Если я хорошо помню, в прошлый раз, когда я пытаюсь отрендерить их все, это все еще очень медленно)

img: http://i1335.photobucket.com/albums/w666/greenpig83/terrain2_zps24b77283.png


person greenpig83    schedule 30.11.2013    source источник


Ответы (1)


Да, в сложных сценах, как правило, мы должны отбраковывать невидимую геометрию для достижения интерактивной частоты кадров. Конечно, это сильно зависит от самой сцены, возможностей API и целевого оборудования.

Вот первые шаги хорошего рендеринга ландшафта (в порядке сложности):

  • Frustum culling - проверка на столкновение между усеченной частью камеры (видимым объемом) и объектами (такими как сетки и плитки ландшафта). Отсутствие столкновения означает, что объект невидим. На основе алгоритмов обнаружения столкновений. Конечно, для этого вам понадобится камера (видовая и проекционная матрицы). Также вам понадобится хорошая математическая библиотека.
  • Пространственное разбиение (например: «Квадратное дерево» в случае местности) - группирование объектов по определенным структурам данных, что позволяет избежать тестов на коллизии, о невозможности которых заранее известно. Невероятно ускоряет отбраковку усеченного конуса. Например, нам не нужно тестировать все плитки, которые находятся за камерой.
  • Уровень детализации (LOD) - различные методы, позволяющие визуализировать объекты, удаленные от камеры, менее детализированными, уменьшая потребление ресурсов. Позволяет визуализировать потрясающие, реалистичные, детализированные сцены с огромными ландшафтами.

Теперь вы знаете, о чем просить гугл;), но все же я добавлю несколько ссылок.

Для начинающих:

Передовой:

  • vterrain.org - источник бесконечных знаний о рендеринге ландшафта (статьи, статьи, ссылки на реализации)
  • Mr. Статьи Хоппе о прогрессивных сетках

Надеюсь, это поможет =)

person Ivan Aksamentov - Drop    schedule 30.11.2013