Ru/Source 2/Docs/Level Design/Visibility

Важно убедиться, что у вас есть правильная геометрия, идущая к процессору видимости для того, чтобы скомпилировать эффективное "vis" решение для ваших карт. Решение Vis в Half-Life:Alyx работает по внутреннему/внешнему алгоритму и пытается выяснить, что находится "внутри" карты при выполнении расчетов видимости. Фактически всё, что находится внутри, будет отображаться, а всё, что находится снаружи, будет отброшено.
== Внутри VS снаружи ==
Visbuilder попытается автоматически определить, какие пространства находятся внутри и за пределами уровня. Основным фактором, который он использует для этого, является видимость передней и задней поверхностей. В общем, пространства с прямым видом достаточной геометрии лицевой стороны и достаточно ограниченным видом геометрии лицевой стороны будут отмечены внутри. Затем, когда работает visbuilder, любые линии обзора, проходящие через внешнее пространство, будут устранены. Это сделано, чтобы компенсировать отсутствие каких-либо ограничений на построение уровней. Уровни часто включают геометрию, которая не является закрытой или имеет геометрию, которая каким-то образом перекрывается. Эти случаи следует обрабатывать, не заставляя систему хранить информацию о видимости под этажами или местностью только потому, что через эти поверхности пробивается некоторая допустимая геометрия. Когда этот алгоритм терпит неудачу, это чаще всего происходит из-за непреднамеренных отверстий во входной геометрии. Важно проверить геометрию ввода, прежде чем искать другие проблемы (используйте предварительный просмотр в Hammer). В общем, вы должны думать о видимости Source 2 как о двусторонней. Каждое видимое пространство также должно выглядеть как действительное пространство для размещения камеры.
== Основное использование ==
Геометрия мира, построенная в Hammer по умолчанию, блокирует видимость. Это можно отключать с помощью опции Исключить из VIS (Exclude from VIS) в свойствах объекта (Object Properties).
Каждый тип 'энтити' не будет блокировать вычисления видимости по умолчанию, включая типы "prop_". Это касается моделей prop_static, которые частенько слишком малы, чтобы блокировать разумное количество видимости за собой, поэтому они полностью пропускаются. Любая геометрия prop_static, которую вы хотите включить в решение vis, должна быть помечена как 'Vis Occluder.' 
Различные типы материалов, в основном текстуры "инструменты", также могут изменять поведение геометрии, к которой они применяются.
Вот некоторые из наиболее распространенных материалов-инструментов, влияющих на видимость:
* tools/visblocker - Поверхности, текстурированные с помощью этой текстуры, удалят все линии обзора, когда они коснутся поверхности. Это полезно для блокировки нежелательных (но реальных) линий обзора из-за дыр в карте. Если вы видите случай, когда какая-то дыра в уровне фактически позволяет видеть какую-то другую часть карты, которая не должна быть видимой, вы можете использовать visblocker, чтобы заблокировать эти линии обзора. Не обязательно идеально заделывать отверстие.
* tools/toolsskybox - Поверхности, текстурированные с помощью этой текстуры инструмента, образуют допустимые линии обзора. При вокселизации мира воксели подразделяются, если они содержат геометрию. Если единственной геометрией в вокселе является toolsskybox, вокселизация остановится на более грубом разрешении. Это повышает производительность компилятора видимости.
* tools/toolsnodraw - Поверхности, текстурированные с помощью этой текстуры инструмента, будут функционировать как обычные видимые поверхности. Единственным исключением является внутренний/внешний тест. В этом тесте toolsnodraw будет эффективно игнорироваться. Таким образом, если в объеме нет других элементов видимой геометрии, этот объем может быть исключен из PVS.
== Просмотр vis в игре ==
Движок может выполнять запись положения камеры для отладки (debug) видимости. Когда запись воспроизводится, визуализация отладки PVS анимирует записанную камеру и обновит визуализацию в режиме реального времени. Например, вы можете использовать это, чтобы увидеть, что происходит с вашим лицом, когда вы идете по коридору. Затем вы можете вылететь и изучить PVS с другой перспективы.
Можно использовать следующие консольные команды:
vis_enable 0/1 	Переключить предварительно вычисленную систему видимости. vis_enable 1 is the default, vis_enable 0 отключает PVS.
vis_debug_show 	Это покажет визуализацию отладки PVS. Положение камеры визуализируется в виде красной сферы, усеченный конус — в белом, а видимые кластеры — в виде зеленых контуров каркаса. Вы можете самостоятельно перемещать камеру и наблюдать за записанной визуализацией отладки PVS.
vis_debug_record_start 	Начинает запись усеченного конуса камеры для воспроизведения.
vis_debug_record_stop 	Останавливает запись.
vis_debug_find_los 	Это найдет любые линии обзора между текущим положением записанной камеры (кластер, содержащий записанную камеру, нарисован красным) и положением фактической камеры (этот кластер нарисован синим цветом). Линии обзора, соединяющие эти два объема кластера, будут нарисованы желтым цветом. Это говорит вам, почему PVS считает, что записанное положение камеры может видеть другое положение.
vis_debug_tracelos 	Используйте это, чтобы исправить вещи, которые должны быть видны из текущей позиции камеры, но не видны. Он проследит сетку лучей, покрывающих текущий экран, и обновит вид, чтобы включить все новые найденные линии обзора. Эти линии обзора записываются в ваш файл los.bin для будущих компиляций карты.
vis_debug_lock 	Включить/выключить блокировку относительно источника LOS до текущей позиции камеры.
vis_debug_currentcluster 	Выводит текущий номер кластера на консоль.
vis_debug_dumpvisibleclusters	Выводит список видимых кластеров на консоль.
vis_debug_drawcluster 	Добавить номер кластера к визуализации, (-1) для очистки.
== Просмотр vis в Hammer ==
Используйте Visibility contributors view, чтобы переключать любую геометрию, которая не влияет на vis. Этот режим скрывает любую геометрию, которая не будет блокировать визы и облегчит обнаружение ошибок на ваших уровнях. Для дальнейших примеров загрузите выпущенные карты из игры, которые поставляются вместе с SDK.
Смотрите для загрузки данных vis кластера в Hammer.
== Рекомендации/общие проблемы ==
Остальная часть этой статьи будет сосредоточена на некоторых наиболее распространенных проблемах, а также на передовых методах.
=== Избегайте дыр в vis, влияющих на геометрию на границе уровня ===
Хотя это не совсем необходимо, vis даст лучшие результаты, если вокруг уровня есть запечатанная оболочка из vis, создающая геометрию, которая четко определяет границу уровня. Отверстия в этой геометрии могут привести к тому, что vis будет окружать пустое пространство вокруг отверстия. Обычно материал Toolsskybox используется для определения границы уровня, на котором в противном случае он был бы открыт для skybox.
=== Не используйте SkyVisBlocker ===
Материал skyvisblocker устарел и не должен использоваться. Вы должны использовать текстуру toolsskybox, чтобы заключить части уровня, которые считаются "открытыми" в Skybox, а visblocker следует использовать для блокировки линий обзора, не влияя иным образом на результаты vis. В качестве оптимизации Skybox не будет отображаться в сценах, в которых не используются toolsskybox.
=== Используйте Solid Block Light с осторожностью ===
Материал Solid Block Light или toolssolidblocklight - это твердая, но невидимая поверхность, которая также блокирует свет. Фактически это функционально то же самое, что и toolsnodraw, но также блокирует свет. Например, место, где крыша над зданием должна блокировать попадание солнечного света внутрь помещения, но игрок также может бросать гранаты на крышу.
Его не следует использовать в пустом пространстве, где не должны создаваться кластеры vis. Материал toolsblocklight можно использовать для блокировки света (отбрасывания теней) без добавления кластеров vis.
=== Избегайте геометрии наружу на границах уровня ===
Геометрия, образующая внешнюю оболочку уровня, всегда должна быть обращена внутрь. Если части внешней оболочки обращены наружу, это не только будет иметь такой же эффект, как дыра, но также может создавать дополнительные нежелательные линии обзора и заставлять вис еще больше заполнять пустое пространство.
=== Избегайте выхода участков за пределы уровня ===
Геометрия, которая способствует визуализации, не должна выходить за пределы внешней оболочки уровня. Как и в случае с обращенной наружу геометрией, это может привести к нежелательным линиям обзора и заполнению пустого пространства vis.
=== Избегайте размещения объектов за пределами уровня ===
Если вы создали герметичную границу уровня, в идеале вся геометрия, которая не является частью 3D-скайбокса, должна находиться внутри оболочки уровня, даже если она не влияет на vis. Объекты, находящиеся за пределами оболочки, будут отбракованы vis нежелательным образом с удалением части или всего объекта.