Version: 5.3 (switch to 5.4b)
Создание ощущения больших и маленьких размеров
Materials, Shaders & Textures

Окно Occlusion Culling

Occlusion Culling это функция, отключающая рендеринг тех объектов, которые в данные момент не видит камера (они закрыты другими объектами). В компьютерной 3D графике это не происходит автоматически. Чаще всего сначала отрисовываются объекты, расположенные дальше от камеры и уже поверх них отрисовываются ближние к камере объекты (это называется “overdraw”). Occlusion Culling отличается от Frustum Culling. Frustum Culling отключает только рендеринг объектов, не попадающих в область обзора камеры, не трогая при этом скрытые по overdraw объекты. Обратите внимание, что Frustum Culling полезен даже при использовании Occlusion Culling.

A maze-like indoor level. This normal scene view shows all visible Game Objects.
A maze-like indoor level. This normal scene view shows all visible Game Objects.
Regular frustum culling only renders objects within the cameras view. This is automatic and always happens.
Regular frustum culling only renders objects within the camera’s view. This is automatic and always happens.
Occlusion culling removes additional objects from within the camera rendering work if they are entirely obscured by nearer objects.
Occlusion culling removes additional objects from within the camera rendering work if they are entirely obscured by nearer objects.

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.

Notice in the Overdraw scene view, a high density of overdraw as many rooms beyond the visible walls are rendered. These arent visible in the game view, but nonetheless time is being taken to render them.
Notice in the Overdraw scene view, a high density of overdraw as many rooms beyond the visible walls are rendered. These aren’t visible in the game view, but nonetheless time is being taken to render them.
With occlusion culling applied, the distant rooms are not rendered, the overdraw is much less dense, and the number of triangles and batches being rendered has dropped dramatically, without any change to how the game view looks.
With occlusion culling applied, the distant rooms are not rendered, the overdraw is much less dense, and the number of triangles and batches being rendered has dropped dramatically, without any change to how the game view looks.

Настройка Occlusion Culling

Для правильного использования Occlusion Culling есть некоторые правила. Во-первых, ваша геометрия на уровне должна быть разбита на куски разумных размеров. Это еще нужно для того, чтобы делить уровень на небольшие, хорошо определенные области, отделенные друг от друга большими объектами типа стен, зданий и т.д. Идея заключается в том, что каждый индивидуальный меш будет либо включен, либо выключен (в зависимости от данных occlusion culling). Так, если у вас есть объект, содержащий всю мебель в комнате, то рендерится будет либо все, либо ничего. В этом случае лучше делать каждый предмет мебели отдельным мешем, тогда каждый из них будет отрендерен в зависимости от точки обзора камеры.

Для того, чтобы на объекты действовал occlusion culling, их нужно пометить тегом Occluder Static в Inspector. Самый быстрый способ сделать это - выделить все нужные вам объекты и пометить их как Occluder Static и Occludee Static.

Помечаем объект для Occlusion Culling
Помечаем объект для Occlusion Culling

Когда следует использовать Occludee Static? Прозрачные объекты, которые не закрывают видимость, а также небольшие объекты, не перекрывающие других объектов, должны быть помечены как Occludees, а не Occluders. Это означает, что они не будут рендерится при закрытии их другими объектами. В случае, когда сами эти объекты закрывают видимость других, рендеринг выключатся не будет. Это помогает снизить вычисления.

Окно Occlusion Culling

Для большинства операций следует использовать окно Occlusion Culling (Window->Occlusion Culling)

В окне Occlusion Culling вы можете работать с мешами и Occlusion Areas(Областями Окклюзии).

Во вкладке Object окна Occlusion Culling Window при выделенном на сцене компоненте Mesh Renderer, вы можете изменять соответствующие Static flags:

Окно Occlusion Culling для Mesh Renderer
Окно Occlusion Culling для Mesh Renderer

Во вкладке Object окна Occlusion Culling, при выделенном Occlusion Area, вы можете работать с соответствующими свойствами OcclusionArea. Для более подробной информации, перейдите в раздел Occlusion Area

Окно Occlusion Culling для Occlusion Area
Окно Occlusion Culling для Occlusion Area

ПРИМЕЧАНИЕ: По умолчанию, если вы не создаете областей для occlusion culling , она применяется ко всей сцене.

ПРИМЕЧАНИЕ: Всякий раз, когда ваша камера находится все области occlusion culling, эта функция применяться не будет. Важно расположить области occlusion culling в местах, где потенциально может находится камера, но слишком большой размер этих мест плохо скажется на производительности во время запекания.

Occlusion Culling - Запекание

Вкладка инспектора запекания Occlusion Сulling
Вкладка инспектора запекания Occlusion Сulling

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 для удаления ранее рассчитанных данных.

Occlusion Culling - Визуализация.

Вкладка инспектора визуализации occlusion culling.
Вкладка инспектора визуализации occlusion culling.

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

Если вы готовы генерировать данные для окклюзии, нажмите кнопку Bake. Не забудьте выбрать Memory Limit на вкладке Bake. Более низкие значения делают генерацию быстрой и менее точной. Более высокие значения, наоборот, дают высокое качество, и, как правило, используются ближе к релизу.

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

После того, как обработка завершится, вы увидите красочные кубы в зоне видимости. Цветные зоны - это регионы с одинаковыми данными окклюзии.

Если хотите удалить вычисленные ранее данные для Occlusion Culling, нажмите кнопку Clear.

Зона отсечения (Occlusion Area)(Pro версия)

Чтобы применить отсечение к подвижным (динамичным) объектам вам необходимо будет создать Occlusion Area, затем изменить её размеры, чтобы она покрывала собой всё то пространство, в котором будут перемещаться эти объекты (само-собой, что такие объекты не могут быть помечены как статичные). Зоны отсечения можно создавать, просто добавляя компонент Occlusion Area к пустым игровым объектам (в меню Component->Rendering->Occlusion Area).

После создания Occlusion Area, выставите галочку Is Target Volume для того, чтобы этой зоной отсекались все подвижные объекты.

Свойство: Функция:
Size Определяет размер зоны отсечения.
Center Позволяет выставить центр зоны отсечения. По-умолчанию его значение равно 0,0,0 и расположен он как правило в центре цветного бокса.
Is View Volume Определяет, где может находиться камера. Выставляйте этот флажок, если вам необходимо отсечь статичные объекты именно в этой зоне отсечения.
Свойства зон отсечений для подвижных объектов.
Свойства зон отсечений для подвижных объектов.

После того как вы добавили зону отсечений, вам необходимо пронаблюдать как она разобьёт бокс на ячейки. Чтобы отследить то, как будет просчитываться зона отсечения, выберете опцию View в параметрах Edit в (Occlusion Culling Preview Panel).Occlusion Culling Preview Panel.

Тестирование полученного отсечения (Testing the generated occlusion)

После того как расчёт был произведён, вы можете протестировать то, что получилось в итоге, путём активации функции отсечения объектов (в Occlusion Culling Preview Panel в режиме визуализации) и перемещая Main Camera в видовом окне сцены.

Режим просмотра отсечений в видовом окне сцены
Режим просмотра отсечений в видовом окне сцены

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

Когда процесс расчётов будет завершён, вы увидите в окне проекции цветные параллелепипеды. Синие кубы представляют являются ячейками Target Volumes. Белые кубы же являются ячейками View Volumes. Они служат для разбиения этих объёмов на мелкие части. Если параметры были выставлены правильно, вы заметите что часть объектов в сцене перестала быть видимой. Это потому что либо они находятся вне поля зрения камеры, либо они закрыты другими объектами.

Если даже после завершения всех расчётов в вашей сцене, все объекты по прежнему видны, т.е. не отсекаются, значит вам надо попробовать разбить их на более мелкие части, которые умещались бы внутри ячеек.

Создание ощущения больших и маленьких размеров
Materials, Shaders & Textures