ALCCLoadVolume: объём загрузки
Наследует AVolume, в панели отображается как LCC Load Volume.
Ключевое отличие от объёма обрезки и секущей плоскости — этап, на котором он действует: обрезка и сечение меняют только итоговый рендеринг, а данные загружаются и передаются в видеопамять как обычно; объём загрузки действует на этапе обхода узлов, и отсеянные узлы вообще не читаются. Поэтому он единственный из трёх снижает объём загрузки и расход видеопамяти.
| Заголовочный файл | Tools/LCCLoadVolume.h |
| Базовый класс | AVolume |
| Blueprint | Blueprintable / BlueprintType |
| Лицензия | Возможность редакции Pro; без лицензии не действует |
Один объём загрузки может действовать сразу на несколько LCC Actor в сцене.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
bEnabled | bool | Включён ли он |
Mode | ELoadRegion | Inside (загружать только то, что внутри) или Outside (исключать то, что внутри) |
VolumeType | ELoadVolumeType | Box или Sphere |
Значение элементов см. в ELoadRegion и ELoadVolumeType.
Ни у одного из трёх свойств нет сеттера, присваивай значение напрямую. Фильтрация действует во время загрузки, поэтому после изменения данные нужно загрузить заново.
Точность границы
Проверка выполняется по узлам, а не по отдельным splat, поэтому граница грубее, чем у объёма обрезки: краевой узел отбрасывается целиком, как только он не удовлетворяет условию.
Два режима используют разные проверки:
| Режим | Условие | Поведение на границе |
|---|---|---|
Inside | Узел загружается только тогда, когда полностью лежит внутри объёма | Сохраняемый диапазон немного меньше объёма |
Outside | Узел исключается, как только он перекрывается с объёмом | Исключаемый диапазон немного больше объёма |
Обе границы намеренно консервативны, что обеспечивает стабильность при переключении LOD. В октодереве ограничивающий бокс дочернего узла всегда находится внутри родительского, и при удалении камеры LOD переключается с дочернего узла на родительский. Если бы Inside использовал проверку на пересечение, родительский узел загружался бы из-за частичного перекрытия и возвращал бы обратно области, уже исключённые дочерними узлами — визуально это выглядело бы как внезапно появляющийся при отдалении фрагмент содержимого. У Outside с проверкой на вложенность возникла бы симметричная проблема.
Когда нужна точная граница, наложи на то же преобразование объём обрезки: объём загрузки уменьшает объём загрузки, а объём обрезки подрезает край.
Создание во время выполнения
ALCCLoadVolume* Volume = GetWorld()->SpawnActor<ALCCLoadVolume>(
ALCCLoadVolume::StaticClass(), Location, FRotator::ZeroRotator);
Volume->VolumeType = ELoadVolumeType::Box;
Volume->Mode = ELoadRegion::Inside;
Volume->bEnabled = true;
Volume->SetActorScale3D(FVector(20.0f, 20.0f, 10.0f));
Component->AddLoadVolume(Volume);
Component->Load(Path); // must be configured before loading
Порядок важен: фильтрация происходит во время загрузки, поэтому добавление или удаление объёма загрузки, а также изменение свойства после Load() не меняют уже загруженные данные, нужна повторная загрузка.
// Reload after changing the filtered range
Volume->SetActorLocation(NewLocation);
Component->Refresh(); // internally UnLoad then Load
Refresh() стоит столько же, сколько полная повторная загрузка, см. ALCCActorBase::Refresh.
Выбор между объёмом загрузки и объёмом обрезки
| Задача | Что использовать |
|---|---|
| Взять небольшую часть из большой сцены, сэкономив видеопамять и время загрузки | Объём загрузки |
| Вырезать проёмы или раскрыть оболочку, когда важна точная граница | Объём обрезки |
| Одновременно сэкономить видеопамять и получить точную границу | Наложить оба с одинаковым преобразованием |
| Часто переключать эффект во время выполнения | Объём обрезки (изменение bEnabled вступает в силу на следующем кадре, без повторной загрузки) |
Смотрите также
- ALCCClippingVolume: объём обрезки
- ALCCSectionPlane: секущая плоскость
- AddLoadVolume: методы добавления и удаления на стороне Component
- Редактирование сцены — объёмы загрузки: порядок применения и иллюстрации
- Редакции и лицензирование: объём лицензии