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). Так, если у вас есть объект, содержащий всю мебель в комнате, то рендерится будет либо все, либо ничего. В этом случае лучше делать каждый предмет мебели отдельным мешем, тогда каждый из них будет отрендерен в зависимости от точки обзора камеры.
Для того, чтобы на объекты действовал occlusion culling, их нужно пометить тегом Inspector. Самый быстрый способ сделать это - выделить все нужные вам объекты и пометить их как и .
вКогда следует использовать
? Прозрачные объекты, которые не закрывают видимость, а также небольшие объекты, не перекрывающие других объектов, должны быть помечены как , а не . Это означает, что они не будут рендерится при закрытии их другими объектами. В случае, когда сами эти объекты закрывают видимость других, рендеринг выключатся не будет. Это помогает снизить вычисления.Для большинства операций следует использовать окно Occlusion Culling (
)В окне Occlusion Culling вы можете работать с мешами и Occlusion Areas(Областями Окклюзии).
Во вкладке Mesh Renderer, вы можете изменять соответствующие Static flags:
окна при выделенном на сцене компонентеВо вкладке Occlusion Area, вы можете работать с соответствующими свойствами OcclusionArea. Для более подробной информации, перейдите в раздел Occlusion Area
окна , при выделенномПРИМЕЧАНИЕ: По умолчанию, если вы не создаете областей для occlusion culling , она применяется ко всей сцене.
ПРИМЕЧАНИЕ: Всякий раз, когда ваша камера находится все области occlusion culling, эта функция применяться не будет. Важно расположить области occlusion culling в местах, где потенциально может находится камера, но слишком большой размер этих мест плохо скажется на производительности во время запекания.
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. |
Когда вы закончите настройки этих значений, нажмите на кнопку
чтобы запустить обработку данных Occlusion Culling. Если вы не удовлетворены результатом, нажмите кнопку для удаления ранее рассчитанных данных.Все объекты в сцене влияют на ограничивающий объем размер, поэтому пытайтесь держать их все в видимых границах сцены.
Если вы готовы генерировать данные для окклюзии, нажмите кнопку
. Не забудьте выбрать на вкладке . Более низкие значения делают генерацию быстрой и менее точной. Более высокие значения, наоборот, дают высокое качество, и, как правило, используются ближе к релизу.Имейте ввиду, что время, необходимое для вычисления данных окклюзии, будет зависеть от уровня ячеек, размера и качества которые вы укажите. Unity покажет статус PVS генерации в нижней части главного окна.
После того, как обработка завершится, вы увидите красочные кубы в зоне видимости. Цветные зоны - это регионы с одинаковыми данными окклюзии.
Если хотите удалить вычисленные ранее данные для Occlusion Culling, нажмите кнопку
.Чтобы применить отсечение к подвижным (динамичным) объектам вам необходимо будет создать Occlusion Area, затем изменить её размеры, чтобы она покрывала собой всё то пространство, в котором будут перемещаться эти объекты (само-собой, что такие объекты не могут быть помечены как статичные). Зоны отсечения можно создавать, просто добавляя компонент Occlusion Area к пустым игровым объектам (в меню ).
После создания Occlusion Area, выставите галочку Is Target Volume для того, чтобы этой зоной отсекались все подвижные объекты.
Свойство: | Функция: |
---|---|
Size | Определяет размер зоны отсечения. |
Center | Позволяет выставить центр зоны отсечения. По-умолчанию его значение равно 0,0,0 и расположен он как правило в центре цветного бокса. |
Is View Volume | Определяет, где может находиться камера. Выставляйте этот флажок, если вам необходимо отсечь статичные объекты именно в этой зоне отсечения. |
После того как вы добавили зону отсечений, вам необходимо пронаблюдать как она разобьёт бокс на ячейки. Чтобы отследить то, как будет просчитываться зона отсечения, выберете опцию Occlusion Culling Preview Panel.
в параметрах в (Occlusion Culling Preview Panel).После того как расчёт был произведён, вы можете протестировать то, что получилось в итоге, путём активации функции отсечения объектов (в Occlusion Culling Preview Panel в режиме визуализации) и перемещая Main Camera в видовом окне сцены.
Во время перемещения камеры по сцене (находитесь вы в игровом режиме или нет), вы заметите как различные объекты сцены будут то исчезать, то появляться. Важность данного процесса состоит в том, что таким образом вы будете отлавливать ошибки результата расчётов отсечений. Вы распознаете объекты, которые выдают ошибки по тому, как они будут внезапно выскакивать в видовом окне во время перемещения камеры по сцене. Одним из выходов из данной ситуации является либо смена выходного разрешения (если вы имеете дело с целевыми объёмами), либо перемещение объектов с места на место таким образом, чтобы они больше не мерцали и тем самым не вызывали дальнейших проблем. Для отладки проблем, связанных с отсечением объектов, вы можете перемещать к проблемным областям главную камеру для их точечной проверки.
Когда процесс расчётов будет завершён, вы увидите в окне проекции цветные параллелепипеды. Синие кубы представляют являются ячейками Target Volumes. Белые кубы же являются ячейками View Volumes. Они служат для разбиения этих объёмов на мелкие части. Если параметры были выставлены правильно, вы заметите что часть объектов в сцене перестала быть видимой. Это потому что либо они находятся вне поля зрения камеры, либо они закрыты другими объектами.
Если даже после завершения всех расчётов в вашей сцене, все объекты по прежнему видны, т.е. не отсекаются, значит вам надо попробовать разбить их на более мелкие части, которые умещались бы внутри ячеек.