Современные методы отбраковки и пакетной обработки при рендеринге

В настоящее время я работаю над обновлением и реструктуризацией движка рендеринга OpenGL. Движок используется для визуализации больших сцен архитектурных данных (зданий с интерьером), и количество объектов может стать довольно большим. Как и в случае с любым зданием, внутри стен много закрытых объектов, и вы, естественно, видите только те объекты, которые находятся в той же комнате, что и вы, или снаружи, если вы находитесь снаружи. В результате остается большое количество объектов, которые должны быть закрыты путем отсечения окклюзии и отсечения усеченного конуса.

В то же время существует много повторяющейся геометрии, которую можно объединять в пакеты рендеринга, а также множество объектов, которые можно рендерить с помощью инстансов рендеринга.

На мой взгляд, может быть сложно оптимальным образом комбинировать пакетирование рендеринга и отбраковку. Если вы помещаете слишком много объектов в один и тот же VBO, трудно отсеять объекты на ЦП, чтобы пропустить рендеринг этого пакета. В то же время, если вы пропустите отбраковку на центральном процессоре, много объектов будет обрабатываться графическим процессором, пока они не видны. Если вы полностью пропустите пакетную обработку, чтобы легче было отбраковывать процессор, будет нежелательно большое количество вызовов рендеринга.

Я провел некоторое исследование существующих методов и теорий относительно того, как эти проблемы решаются в современной графике, но мне не удалось найти какое-либо конкретное решение. Идея, к которой пришли мы с коллегой, заключалась в том, чтобы ограничивать партии объектами, находящимися относительно близко друг к другу, например, всеми стульями в комнате или в радиусе n метров. Это можно упростить и оптимизировать с помощью окт-деревьев.

Есть ли у кого-нибудь указания на методы, используемые для управления сценами, отбраковки, пакетирования и т. Д. В современных графических движках?


person Kristian Skarseth    schedule 21.06.2013    source источник
comment
Позвольте мне начать с того, что я ничего не знаю ни о каком современном графическом движке. Но это звучит как проблема без единого решения, вместо этого ее обычно можно решить, установив исправления и переключая несколько подходов вместе, чтобы обеспечить наилучшее качество / производительность для данного сценария. Просто потому, что качество и производительность всегда исключают друг друга, когда на них оказывается давление. Я обычно решаю свои вызовы отрисовки, объединяя все (!) Вместе в блоки, удобные для усеченной конструкции (для вас: комнаты), используя массивы текстур и многое другое, что может быть очень полезно в средах статической архитектуры.   -  person Full Frontal Nudity    schedule 04.07.2013


Ответы (1)


В Интернете есть много информации об усеченной пирамиде и отбраковке окклюзии. Большая часть поступает от разработчиков игр. Вот список некоторых статей, которые помогут вам начать работу:

Мой (довольно быстрый) рендерер работает примерно так:

  1. Коллекция: отправьте все реквизиты, которые вы хотите визуализировать, в средство визуализации.
  2. Frustum culling: средство визуализации отбирает невидимые реквизиты из списка, используя несколько параллельных потоков.
  3. Отсечение окклюзии: теперь вы можете выполнять отсечение окклюзии на ЦП (я еще не реализовал его, потому что он мне сейчас не нужен). Подробную информацию о том, как это сделать эффективно, можно найти на слайдах Killzone и Crysis. Одним из решений может быть считывание буфера глубины предыдущего кадра из графического процессора, а затем растеризация ограничивающих прямоугольников объектов поверх него, чтобы проверить, виден ли объект.
  4. Разделение: поскольку теперь вы знаете, какие объекты на самом деле нужно визуализировать, поскольку они видимы, вам необходимо разделить их по сетке, потому что каждая сетка имеет свой материал или текстуру (в противном случае они будут объединены в одиночная сетка).
  5. Batching: Now you have a list of meshes to render. You can sort them:
    • by depth (this can be done on the prop level instead of the mesh level), to save fillrate (I don't recommend doing this if your fragment shaders are very simple).
    • по сетке (потому что может быть несколько экземпляров одной и той же сетки, и это упростит добавление экземпляров).
    • по текстуре, потому что переключение текстуры очень дорогое.
  6. Рендеринг: просматривайте разбитые на разделы сетки и визуализируйте их.

И как уже говорилось в «Полная фронтальная нагота»: идеального решения не существует.

person Tara    schedule 02.05.2014