Введение в CullingGroup API
CullingGroup позволяет интегрировать собственные системы в конвейер отсечения и LOD Unity. Это можно использовать для различных целей, например:
- Симулирование толпы людей, имея только полный GameObjects для символов, которые на самом деле видны прямо сейчас
- Создание системы частиц GPU, управляемой Graphics.DrawProcedural, но пропуская рендеринг систем частиц, которые находятся за стеной
- Отслеживание того, какие точки появления врагов скрыты от камеры, чтобы враги не появлялись в поле зрения игрока.
- Переключение персонажей от полноценности анимации и AI расчетов, когда они близко, к низкокачественному дешевому поведению на расстоянии
- Имея 10,000 точек маркера в вашей сцене и эффективно выясняя, когда игрок получает в пределах 1м от любого из них
API работает так, что вы предоставляете массив ограничивающих сфер. Видимость этих сфер относительно конкретной камеры затем рассчитывается, вместе со значением «дистанционной полосы», которое может рассматриваться как число уровня LOD.
CullingGroup API Наилучшие виды практики
При рассмотрении вопроса о том, как вы можете применить CullingGroup к вашему проекту, рассмотрите следующие аспекты дизайна CullingGroup.
Использование видимости
Все объёмы, для которых CullingGroup вычисляет видимость, задаются ограничивающими сферами — то есть позицией (центром сферы) и значением радиуса. Другие ограничивающие формы из соображений производительности не поддерживаются. На практике это значит, что вы задаёте сферу, полностью охватывающую объект, который нужно отсекать. Если требуется более точное соответствие, попробуйте использовать несколько сфер, покрывающих разные части объекта, и принимать решения на основе состояния видимости всех сфер.
Для оценки видимости, CullingGroup должен знать, с какой камеры следует рассчитывать видимость. В настоящее время один CullingGroup поддерживает только одну камеру. Если вам нужно оценить видимость нескольких камер, вы должны использовать один CullingGroup на каждую камеру и объединить результаты.
CullingGroup вычисляет видимость только на основе отсечения по пирамиде видимости и статического отсечения невидимой геометрии. Динамические объекты как возможные загораживающие объекты он не учитывает.
Использование расстояния
CullingGroup способен вычислять расстояние между некоторой точкой отсчета (например, позицией камеры или проигрывателя) и ближайшей точкой на каждой сфере. Это значение расстояния не предоставляется вам напрямую, а вместо этого квантуется с помощью набора пороговых значений, которые вы предоставляете, чтобы вычислить дискретный целый результат «дистанционной полосы». Намерение состоит в том, чтобы вы интерпретировали эти полосы расстояния как «близкий диапазон», «средний диапазон», «дальней диапазон» и так далее.
CullingGroup будет предоставлять обратные вызова, когда объект перемещается из одной полосы в другую, давая вам возможность делать такие вещи, как изменение поведения этого объекта на что-то менее CPU-интенсивное.
Любые сферы, находящиеся за пределами последней полосы расстояния, будут считаться невидимым, что позволит вам легко построить реализацию, которая полностью деактивирует объекты, находящиеся очень далеко. Если вы не хотите этого поведения, просто установите значение конечного порога на бесконечное расстояние.
На CullingGroup поддерживается только одна точка отсчета.
Производительность и дизайн
API CullingGroup не позволяет внести изменения в сцену и тут же запросить новое состояние видимости ограничивающей сферы. Из соображений производительности CullingGroup вычисляет новые сведения о видимости только во время отсечения для камеры в целом; именно тогда они и становятся вам доступны — через обратный вызов или через запрос к API CullingGroup. На практике это значит, что работать с CullingGroup нужно асинхронно.
Массив границ сфер, который вы предоставляете CullingGroup, ссылается на CullingGroup, а не копируется. Это означает, что вы должны сохранить ссылку на массив, который вы передаете SetBoundingSpheres, и что вы можете изменять содержимое этого массива без необходимости повторно вызывать SetBoundingSpheres. Если вам нужны несколько CullingGroups, которые рассчитывают видимость и расстояния для одного и того же набора сфер — например, для нескольких камер — тогда эффективно, чтобы все CullingGroups делили один и тот же экземпляр массива границ сфер.