Occlusion Culling это функция, отключающая рендеринг тех объектов, которые в данные момент не видит камера (они закрыты другими объектами). В компьютерной 3D графике это не происходит автоматически. Чаще всего сначала отрисовываются объекты, расположенные дальше от камеры и уже поверх них отрисовываются ближние к камере объекты (это называется “overdraw”). Occlusion Culling отличается от Frustum Culling. Frustum Culling отключает только рендеринг объектов, не попадающих в область обзора камеры, не трогая при этом скрытые по overdraw объекты. Обратите внимание, что Frustum Culling полезен даже при использовании Occlusion Culling.
Occlusion сulling, используя виртуальную камеру, проходит по сцене для построения иерархии потенциально видимых наборов объектов. Эти данные используются в рантайме каждой камерой для определения того что она видит, и что нет. Опираясь на полученную информацию, Unity обеспечивает рендеринг только видимых объектов. Это уменьшает количество draw calls и увеличивает производительность игры.
Данные для occlusion culling состоят из ячеек. Каждая ячейка - частичка сцены. Ячейки образуют бинарное дерево. Occlusion Culling использует два дерева. Первое View Cells(для статичных объектов), второе Target Cells(для движущихся объектов). View Cells содержит список индексов, который определяет видимость статичных объектов с более высокой точностью.
Об этом важно помнить при создании объектов, потому что нужен хороший баланс между размерами объектов и ячеек. В идеале, у вас не должно быть ячеек, которые очень малы по сравнению с объектами. И в то же время, у вас не должно быть объектов, охватывающих большое количество ячеек. Иногда полезно разбивать большие объекты на части. Иногда полезно объединять маленькие объекты между собой (для уменьшения draw calls), и, пока они остаются в одной ячейке, occlusion culling будет корректно работать. Коллекцию ячеек и информацию о видимости, определяющую какие ячейки выдимы из другой ячейки, называют PVS (Potentially Visible Set).
You can use the ‘overdraw’ scene rendering mode to see the amount of overdraw that is occuring, and the stats information pane in the game view to see the amount of triangles, verts, and batches that are being rendered. Below is a comparison of these before and after applying occlusion culling.
Для правильного использования Occlusion Culling есть некоторые правила. Во-первых, ваша геометрия на уровне должна быть разбита на куски разумных размеров. Это еще нужно для того, чтобы делить уровень на небольшие, хорошо определенные области, отделенные друг от друга большими объектами типа стен, зданий и т.д. Идея заключается в том, что каждый индивидуальный меш будет либо включен, либо выключен (в зависимости от данных occlusion culling). Так, если у вас есть объект, содержащий всю мебель в комнате, то рендерится будет либо все, либо ничего. В этом случае лучше делать каждый предмет мебели отдельным мешем, тогда каждый из них будет отрендерен в зависимости от точки обзора камеры.
You need to tag all scene objects that you want to be part of the occlusion to Occluder Static in the Inspector. The fastest way to do this is to multi-select the objects you want to be included in occlusion calculations, and mark them as Occluder Static and Occludee Static.
When should you use Occludee Static? Completely transparent or translucent objects that do not occlude, as well as small objects that are unlikely to occlude other things, should be marked as Occludees, but not Occluders. This means they will be considered in occlusion by other objects, but will not be considered as occluders themselves, which will help reduce computation.
When using LOD groups, only the base level object (LOD0) may be used as an Occluder.
For most operations dealing with Occlusion Culling, you should use the Occlusion Culling Window (Window > Rendering > Occlusion Culling)
In the Occlusion Culling Window, you can work with occluder meshes, and Occlusion Areas.
Во вкладке Object окна Occlusion Culling Window при выделенном на сцене компоненте Mesh Renderer, вы можете изменять соответствующие Static flags:
Во вкладке Object окна Occlusion Culling, при выделенном Occlusion Area, вы можете работать с соответствующими свойствами OcclusionArea. Для более подробной информации, перейдите в раздел Occlusion Area
ПРИМЕЧАНИЕ: По умолчанию, если вы не создаете областей для occlusion culling , она применяется ко всей сцене.
NOTE: Whenever your camera is outside occlusion areas, occlusion culling will not be applied. It is important to set up your Occlusion Areas to cover the places where the camera can potentially be, but making the areas too large incurs a cost during baking.
The occlusion culling bake window has a “Set Default Parameters” button, which allows you to reset the bake values to Unity’s default values. These are good for many typical scenes, however you’ll often be able to get better results by adjusting the values to suit the particular contents of your scene.
Свойства | Функция: |
---|---|
Smallest Occluder | The size of the smallest object that will be used to hide other objects when doing occlusion culling. Any objects smaller than this size will never cause objects occluded by them to be culled. For example, with a value of 5, all objects that are higher or wider than 5 meters will cause hidden objects behind them to be culled (not rendered, saving render time). Picking a good value for this property is a balance between occlusion accuracy and storage size for the occlusion data. |
Smallest Hole | This value represents the smallest gap between geometry through which the camera is supposed to see. The value represents the diameter of an object that could fit through the hole. If your scene has very small cracks through which the camera should be able to see, the Smallest Hole value must be smaller than the narrowest dimension of the gap. |
Backface Threshold | Unity’s occlusion uses a data size optimization which reduces unnecessary details by testing backfaces. The default value of 100 is robust and never removes backfaces from the dataset. A value of 5 would aggressively reduce the data based on locations with visible backfaces. The idea is that typically, valid camera positions would not normally see many backfaces - for example, the view of the underside of a terrain, or the view from within a solid object that you should not be able to reach. With a threshold lower than 100, Unity will remove these areas from the dataset entirely, thereby reducing the data size for the occlusion. |
Когда вы закончите настройки этих значений, нажмите на кнопку Bake чтобы запустить обработку данных Occlusion Culling. Если вы не удовлетворены результатом, нажмите кнопку Clear для удаления ранее рассчитанных данных.
Все объекты в сцене влияют на ограничивающий объем размер, поэтому пытайтесь держать их все в видимых границах сцены.
When you’re ready to generate the occlusion data, click the Bake button. Remember to choose the Memory Limit in the Bake tab. Lower values make the generation quicker and less precise, higher values are to be used for production quality closer to release.
Имейте ввиду, что время, необходимое для вычисления данных окклюзии, будет зависеть от уровня ячеек, размера и качества которые вы укажите. Unity покажет статус PVS генерации в нижней части главного окна.
После того, как обработка завершится, вы увидите красочные кубы в зоне видимости. Цветные зоны - это регионы с одинаковыми данными окклюзии.
Если хотите удалить вычисленные ранее данные для Occlusion Culling, нажмите кнопку Clear.
Чтобы применить отсечение к подвижным (динамичным) объектам вам необходимо будет создать Occlusion Area, затем изменить её размеры, чтобы она покрывала собой всё то пространство, в котором будут перемещаться эти объекты (само-собой, что такие объекты не могут быть помечены как статичные). Зоны отсечения можно создавать, просто добавляя компонент Occlusion Area к пустым игровым объектам (в меню Component->Rendering->Occlusion Area).
After creating the Occlusion Area, check the Is View Volume checkbox to occlude moving objects.
Свойство: | Функция: |
---|---|
Size | Определяет размер зоны отсечения. |
Center | Позволяет выставить центр зоны отсечения. По-умолчанию его значение равно 0,0,0 и расположен он как правило в центре цветного бокса. |
Is View Volume | Определяет, где может находиться камера. Выставляйте этот флажок, если вам необходимо отсечь статичные объекты именно в этой зоне отсечения. |
After you have added the Occlusion Area, you need to see how it divides the box into cells. To see how the occlusion area will be calculated, select Edit and toggle the View button in the Occlusion Culling Preview Panel.
После того как расчёт был произведён, вы можете протестировать то, что получилось в итоге, путём активации функции отсечения объектов (в Occlusion Culling Preview Panel в режиме визуализации) и перемещая Main Camera в видовом окне сцены.
Во время перемещения камеры по сцене (находитесь вы в игровом режиме или нет), вы заметите как различные объекты сцены будут то исчезать, то появляться. Важность данного процесса состоит в том, что таким образом вы будете отлавливать ошибки результата расчётов отсечений. Вы распознаете объекты, которые выдают ошибки по тому, как они будут внезапно выскакивать в видовом окне во время перемещения камеры по сцене. Одним из выходов из данной ситуации является либо смена выходного разрешения (если вы имеете дело с целевыми объёмами), либо перемещение объектов с места на место таким образом, чтобы они больше не мерцали и тем самым не вызывали дальнейших проблем. Для отладки проблем, связанных с отсечением объектов, вы можете перемещать к проблемным областям главную камеру для их точечной проверки.
Когда процесс расчётов будет завершён, вы увидите в окне проекции цветные параллелепипеды. Синие кубы представляют являются ячейками Target Volumes. Белые кубы же являются ячейками View Volumes. Они служат для разбиения этих объёмов на мелкие части. Если параметры были выставлены правильно, вы заметите что часть объектов в сцене перестала быть видимой. Это потому что либо они находятся вне поля зрения камеры, либо они закрыты другими объектами.
Если даже после завершения всех расчётов в вашей сцене, все объекты по прежнему видны, т.е. не отсекаются, значит вам надо попробовать разбить их на более мелкие части, которые умещались бы внутри ячеек.