ULCC2Component: компонент конвейера LCC2
Component, специфичный для конвейера LCC2, наследует ULCCComponentBase. Дополнительно предоставляет управление полосами сферических гармоник, систему нормалей для освещения и управление порогом глубины.
| Модуль | LCC4UnrealRuntime |
| Заголовочный файл | LCC2Component.h |
| Родительский класс | ULCCComponentBase |
| Кто им владеет | ALCC2Actor, ASogActor, ASpzActor, APlyActor |
#include "LCC2Component.h"
Получение экземпляра:
ULCC2Component* Comp = Cast<ULCC2Component>(LCC2Actor->GetLCCComponent());
Этот компонент обслуживает сразу четыре формата данных: каталог LCC2, .sog, .spz и .ply. Последние три повторно используют тот же конвейер рендеринга за счёт построения виртуальной метаинформации, поэтому во всех случаях получаешь ULCC2Component.
Примечание: интерфейсы для нескольких вьюпортов из базового класса (
SetPlayerLoadMode,SetPlayerRenderMode,SetSceneCaptureLoadMode,SetSceneCaptureRenderMode,ModifyPlayerTransform,CancelModifyPlayerTransform) не применимы к конвейеру LCC2; вызов не приводит к ошибке, но и не даёт ожидаемого результата. Подробнее см. ULCCComponent.
Свойства
| Свойство | Тип | По умолчанию | Диапазон | Описание |
|---|---|---|---|---|
SHBands | int32 | 3 | 1~3 | Число полос сферических гармоник. По умолчанию берётся число, сохранённое в данных, оно же является верхним пределом |
bSyncLoadAtRuntime | bool | true | — | Загружать ли одиночные форматы синхронно на этапе BeginPlay в упакованной сборке |
LightingScale | float | 0.0 | 0~1 | Яркость исходного цвета 3DGS до вмешательства освещения сцены |
AlphaThreshold | float | 0.5 | 0.01~0.99 | Порог накопленной непрозрачности для определения медианной глубины, дополнительный пункт |
NormalMode | ELCC2NormalGenerationMode | Fixed | — | Режим генерации нормалей, определяет реакцию 3DGS на свет сцены |
FixedNormal | FVector | (0, 0, 1) | — | Общая мировая нормаль для всего массива 3DGS в режиме Fixed |
NormalPole | FVector | (1, 0, 1) | — | Ориентация поверхности в режиме Hemispherical |
NormalHemiSpread | float | 0.5 | 0~4 | Сила перехода между светом и тенью в режиме Hemispherical |
Свойства, связанные с нормалями, помечены EditConditionHides, поэтому в панели Details отображаются только те из них, которые используются при текущем NormalMode.
bSyncLoadAtRuntime имеет смысл только для одиночных форматов (.ply / .spz / .sog), поэтому отображается лишь в панели Details этих трёх Actor. При включении в упакованной сборке игровой поток блокируется до готовности данных, что предотвращает чёрный экран в начале; при выключении изображение появляется сразу, а данные дополняются в фоне. В редакторе загрузка всегда асинхронная и от этого значения не зависит. См. Быстрый старт — загрузка одиночных файлов при запуске.
Ещё два отличия от базового класса:
MetaInfo(типFLCC2MetaInfo) — приватный член, недоступный извне на стороне C++, и виден только Blueprint (в панели Details только для чтения). В C++ используй GetMetaInfo2, чтобы получить полный набор полей.- При конструировании настройка полной загрузки в
Performanceпереписывается на «переключатель включён, значениеfalse», что противоположно значению по умолчанию вFRenderInfo. То есть по умолчанию LCC2 не использует полную загрузку, и при необходимости её нужно включить явно.
Сферические гармоники
SetSHBands / GetSHBands
UFUNCTION(BlueprintCallable, Category = "XGrids")
void SetSHBands(int32 InSHBands);
UFUNCTION(BlueprintPure, Category = "XGrids")
int32 GetSHBands() const;
Задаёт число полос сферических гармоник, участвующих в расчёте, диапазон 1~3. Действует для всех форматов, отображаемых этим компонентом, включая LCC2, SOG, SPZ и PLY.
| Параметр | Тип | Описание |
|---|---|---|
InSHBands | int32 | Число полос: 1 — самое экономное, 3 — самое полное. Значение выше фактически сохранённого в данных не действует |
Замечания по применению:
- Значение по умолчанию берётся из загруженных данных и одновременно является верхним пределом. Если в данных сохранено только 2 полосы, установка 3 не даст дополнительного эффекта.
- По сравнению с полным отключением гармоник через
SetUseShcoef(false)понижение числа полос — более тонкий компромисс. - Условие срабатывания:
bUseShcoefвключено и режим отображения — 3DGS, иначе значение в расчёте не участвует. - О соотношении качества изображения и затрат см. Настройка изображения — полосы SH.
ULCC2Component* Comp = Cast<ULCC2Component>(Actor->GetLCCComponent());
if (Comp)
{
// Drop to 2 bands on mid-range hardware
Comp->SetSHBands(2);
}
Вариант с настройкой по уровням качества:
void ConfigureSH(ULCC2Component* Comp, EQualityTier Tier)
{
if (!Comp || !Comp->CanSetShcoef())
{
return; // the data itself has no spherical harmonics, nothing to do
}
switch (Tier)
{
case EQualityTier::High:
Comp->SetUseShcoef(true);
Comp->SetSHBands(3);
break;
case EQualityTier::Medium:
Comp->SetUseShcoef(true);
Comp->SetSHBands(2);
break;
case EQualityTier::Low:
Comp->SetUseShcoef(false); // turn it off entirely
break;
}
}
Освещение
LightingScale
UPROPERTY(Interp, EditAnywhere, BlueprintReadWrite, Category = "XGrids|Lighting",
meta = (UIMin = "0.0", UIMax = "1.0", ClampMin = "0.0", ClampMax = "1.0"))
float LightingScale = 0.0f;
Базовая яркость цвета 3DGS до вмешательства освещения сцены, диапазон 0~1, по умолчанию 0. Значение 0 означает, что всё определяется освещением сцены, 1 — что исходная яркость сохраняется полностью.
Влияние значений и способ настройки см. в Нормалях и освещении — масштаб освещения LCC2.
Замечания по применению:
- Имеет смысл только при
LightMode, равномLit; в режимеUnlitне действует. - Это свойство
BlueprintReadWrite, значение присваивается напрямую, функции-сеттера нет. - Помечено
Interp, поэтому в Sequencer можно расставить ключевые кадры для смены дня и ночи.
Comp->SetLightMode(ELightMode::Lit);
Comp->LightingScale = 0.3f; // keep 30% of the original brightness, leave the rest to scene light
NormalMode
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XGrids|Lighting")
ELCC2NormalGenerationMode NormalMode = ELCC2NormalGenerationMode::Fixed;
Управляет тем, как поверхность 3DGS реагирует на освещение сцены. У самих данных 3DGS нет геометрических нормалей, и первые три режима строят нормали приближёнными способами; реальные нормали даёт только ProxyMesh.
Сравнение результата четырёх режимов, области их применения и способы настройки см. в Нормалях и освещении, определение значений — в Enums.
// Fixed mode, normal pointing up
Comp->NormalMode = ELCC2NormalGenerationMode::Fixed;
Comp->FixedNormal = FVector(0.0, 0.0, 1.0);
// Hemispherical mode, adjust the sweep direction and contrast of the lighting
Comp->NormalMode = ELCC2NormalGenerationMode::Hemispherical;
Comp->NormalPole = FVector(1.0, 0.0, 1.0);
Comp->NormalHemiSpread = 1.2f;
FixedNormal
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XGrids|Lighting",
meta = (EditCondition = "NormalMode == ELCC2NormalGenerationMode::Fixed", EditConditionHides))
FVector FixedNormal = FVector(0.0, 0.0, 1.0);
Только для режима Fixed. Общая нормаль в мировом пространстве для всего массива 3DGS, по умолчанию направлена вверх. Нормализация не требуется.
Замечания по применению:
- Одна общая нормаль для всего массива означает, что яркость всего массива одинакова и равна
dot(нормаль, направление света). - Когда свет падает с обратной стороны нормали, весь массив темнеет вплоть до полной черноты. В наружных сценах, где нормаль направлена вверх, а источник света находится сверху, проблем обычно нет.
- Если основной объект сцены — стена, разумнее задать нормаль по ориентации стены.
NormalPole
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XGrids|Lighting",
meta = (EditCondition = "NormalMode == ELCC2NormalGenerationMode::Hemispherical", EditConditionHides))
FVector NormalPole = FVector(1.0, 0.0, 1.0);
Только для режима Hemispherical. Направление, в котором считается ориентированной поверхность; определяет, как граница света и тени перемещается по 3DGS при повороте направленного света. Нормализация не требуется.
Способ настройки: сначала выставь направленный свет, затем подстраивай этот вектор и смотри, соответствует ли ход границы света и тени ожиданиям.
NormalHemiSpread
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XGrids|Lighting",
meta = (UIMin = "0.0", UIMax = "4.0", ClampMin = "0.0",
EditCondition = "NormalMode == ELCC2NormalGenerationMode::Hemispherical", EditConditionHides))
float NormalHemiSpread = 0.5f;
Только для режима Hemispherical. Сила перехода между светом и тенью на поверхности, диапазон 0~4, по умолчанию 0.5.
Чем меньше значение, тем ровнее и однороднее распределение света и тени; чем больше, тем сильнее контраст между освещённой и затенённой областями.
AlphaThreshold
UPROPERTY(Interp, EditAnywhere, BlueprintReadWrite, Category = "XGrids", AdvancedDisplay,
meta = (UIMin = "0.01", UIMax = "0.99", ClampMin = "0.01", ClampMax = "0.99"))
float AlphaThreshold = 0.5f;
Порог накопленной непрозрачности для определения медианной глубины, диапазон 0.01~0.99, по умолчанию 0.5. Относится к дополнительным пунктам.
Непрозрачность накапливается от близких точек к далёким, и когда накопленное значение достигает порога, текущая глубина записывается как представительная глубина этого пикселя. При меньших значениях глубина смещается к камере, при больших — в сторону от неё.
Влияет на взаимное перекрытие 3DGS и традиционных мешей, на отбрасывание теней и на постобработку. Значение по умолчанию подходит для большинства случаев, описание значений см. в Настройке изображения — порог глубины.
GetEffectiveNormalGenerationMode
UFUNCTION(BlueprintPure, Category = "XGrids")
ELCC2NormalGenerationMode GetEffectiveNormalGenerationMode() const;
Возвращает режим нормалей, фактически действующий после проверки лицензии.
Возвращаемое значение: при наличии лицензии возвращается исходное значение NormalMode; если выбран ProxyMesh, требующий лицензии, но лицензии нет, возвращается Fixed.
Замечания по применению:
- Сохранённое свойство
NormalModeне изменяется, просто рендеринг идёт по понижённому режиму. Поэтому чтениеNormalModeи результат этой функции могут не совпадать. - Используй её для подсказок в интерфейсе. Если пользователь выбрал
ProxyMesh, а фактически работаетFixed, в интерфейсе стоит дать пояснение.
const ELCC2NormalGenerationMode Requested = Comp->NormalMode;
const ELCC2NormalGenerationMode Effective = Comp->GetEffectiveNormalGenerationMode();
if (Requested != Effective)
{
UE_LOG(LogTemp, Warning,
TEXT("ProxyMesh mode requires a license, fell back to Fixed"));
}
Blueprint в виде текста:
[Get Effective Normal Generation Mode]
Target = (LCC2 Component)
│ Return Value ──┐
▼ │
[Equal (Enum)] ◀─────────┘
A = (Return Value)
B = Proxy Mesh
│
▼
[Branch]
│ False
▼
[Print String] In String = "ProxyMesh requires a license, fell back to Fixed"
Другие методы
GetMetaInfo2
FLCC2MetaInfo GetMetaInfo2();
Возвращает полную метаинформацию LCC2. Доступно только в C++.
По сравнению с GetMetaInfo() базового класса дополнительно содержит рабочий путь, тип источника данных, число полос сферических гармоник, корневой узел октодерева, список файлов и другие поля. Описание полей см. в Structs.
GetLccVersion
virtual ELCCVersion GetLccVersion() const override;
Всегда возвращает ELCCVersion::LCC2.
Смотрите также
- Нормали и освещение: полное описание режимов нормалей и яркости освещения
- Настройка изображения: значения параметров вида полос SH и порога глубины
- ULCCComponentBase: общие интерфейсы рендеринга и производительности
- ALCC2ProxyMesh: Actor, сопутствующий режиму нормалей
ProxyMesh - Actor SOG / SPZ / PLY: эти три формата тоже используют этот компонент
- Enums: значения режимов нормалей