Landscape – технический гайд по ландшафтам

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

Технические детали

Валидные размеры  полей высот   ландшафтов  не всегда очевидны в самом начале.  Чтоб иметь возможность определить  размеры для полей высот, которые  валидны и  оптимальны, нужно понимать внутреннюю архитектуру Ландшафтов.  Чтоб создать систему, позволяющую  использовать большие ландшафты, которые эффективны с точки зрения используемой памяти и производительности, архитектура ограничивает размеры  полей высот, а это означает, что  есть определенные размеры, которые валидны, и прочие, не подходящие. В прежних системах ландшафтов в Unreal Engine либо вообще не  было никаких ограничений (любые размеры были валидны и могли работать), либо ограничения были не строгие. Ограничения для  полей высот  ландшафтов гораздо более сложные и строгие.

Landscape Actor закодирован цветом, так что легко сказать, что именно делает каждая секция. Границы  Landscape окрашены желтым, края каждого компонента подсвечены светло-зеленым, края секции (если секция размерами  2×2) окрашены зеленым, а отдельные  Landscape-квадраты  окрашены в темно-зеленый.

Color: Landscape Component
Yellow: Landscape Actor Edge
Light Green: Landscape Component Edge
Medium Green: Landscape Section Edge
Dark Green: Landscape Individual Quad

Landscape-компоненты

Ландшафты разделены  на множество компонентов, которые представляют собой базовый юнит  Unreal в плане рендеринга, расчетов видимости и  столкновения. Components в Landscape все одинакового размера и всегда квадратные. Размер Landscape component определяется при создании Landscape, и выбор зависит от размера и деталей Landscape, который вы хотите создать

Данные высоты каждого компонента хранятся в одной единственной текстуре. Поэтому ее размер должен быть числом вершин в квадрате. Общий ряд вершин по краям двух соседствующих компонентов дублируется и хранится в каждом компоненте. По этой причине вы должны подумать о количестве квадратов  в каждом компоненте.

Ниже представлен очень простой Landscape (подсвечен зеленым), содержащий 4 компонента. Каждый компонент состоит из простого квадрата. Один компонент отделен, чтоб показать, как дублируются те вершины, где встречаются компоненты.

Секции компонента

Компоненты можно опционально разделить на 1 или 4 (2×2) подсекции. Эти секции служат базовым юнитом расчетов Landscape LOD.

Использование   подсекции 4 (2×2)  дает вам тот же размер поля высот, как если бы вы использовали в четыре раза больше компонентов всего лишь с одной подсекцией каждый, но использование нескольких компонентов обычно приводит к большей производительности.

Размер каждой секции (количество вершин) должен быть в  квадрате (максимально 256×256). Таким образом разные уровни LOD могут хранится в мипмапе  текстуры.  Так мы получим  число квадратов в компоненте, также это число в квадрате минус 1. (если 1 секция на компонент) или числов квадрате минус 2 (если 4 секции на компонент).

Отдельный  компонент, который проиллюстрирован ниже, содержит 4 секции. Каждая секция состоит из 9  (3×3) квадратов. И опять, вы можете заметить, что вершины, где секции встречаются, дублируются.

Расчет размеров поля высот

Как вы можете видеть, размеры для Landscape вытекают  из количества  квадратов в каждой секции, количеста секций в каждом компоненте и количества компонентов, представленных в Landscape. Определив количество компонентов и, найдя  решение для каждого из этих компонентов, вы можете подсчитать размеры Landscape.

Вот несколько примерных сценариев:

Пример 1

Если мы начинаем с компонента с одной единственной секцией, которая содержит 64×64 вершин, то   размер такого компонента составляет 63×63 квадратов . Скажем у нас есть Landscape размером  10×10 этих компонентов, то есть у нас 630×630 квадратов в общем в нашем Landscape. Теперь, если мы хотим импортировать высоты для такого Landscape, то у нас появится поле высот размером 631×631 вершин, потому что вершин всегда на один ряд больше, чем квадратов. Так что  631×631 – это валидный размер  Landscape.

Пример 2

Если у нас есть компонент, поделенный на 4 подсекции, каждая из которых собрана из 64×64 вершин, то это ведет к  63×63 квадратам на секцию, и  126×126 квадрат на компонент.  Если у нас 32×32 этих компонентов, то мы получаем 126 * 32 = 4032 квадратов в общем в каждом направлении. Так что общий Landscape будет  содержать 4033×4033 вершин.

Эти примеры фокусируются на квадратных ландшафтах. Но, как бы то ни было,  Landscape не обязательно должен быть квадратным. Например, в первом примере  10×10 не обязательные размеры. Предлагая 63 квадрата на компонент, вы можете иметь любой Landscape из компонентов AxB с конечным размером в вершинах (A*63+1 , B*63+1).

Вопросы производительности

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

Каждый компонент нагружает  центральный процессор  и каждая секция посылает команду, так что попытайтесь минимизировать эту нагрузку и число команд. Для самых крупных ландшафтов рекомендуется использовать  1024 компонентов максимально.

Рекомендованные размеры ландшафтов

Чтоб облегчить дело, вот вам размеры, которые максимизируют область, но минимизируют количество компонентов Landscape.

Overall size (vertices) Quads / section Sections / component Component size Total Components
8129×8129 127 4 (2×2) 254×254 1024 (32×32)
4033×4033 63 4 (2×2) 126×126 1024 (32×32)
2017×2017 63 4 (2×2) 126×126 256 (16×16)
1009×1009 63 4 (2×2) 126×126 64 (8×8)
1009×1009 63 1 63×63 256 (16×16)
505×505 63 4 (2×2) 126×126 16 (4×4)
505×505 63 1 63×63 64 (8×8)
253×253 63 4 (2×2) 126×126 4 (2×2)
253×253 63 1 63×63 16 (4×4)
127×127 63 4 (2×2) 126×126 1
127×127 63 1 63×63 4 (2×2)

Режим Layer Debug

Режим Layer Debug визуализирует влияние  определенных уровней на Landscape в Viewport. Вы можете включить режим Layer Debug в меню View, который находится в Viewport, в Landscape Visualizers.

При включенном режиме Layer Debug  кнопки-пульки, позволяют выбрать отдельные цветовые каналы, которые перечислены в списке целевого уровня.

Выбор уровня применит шейдер к Landscape, и он  покажет область, которую покрывает канал выбранного целевого уровня.