3DGS 画面パラメーターの調節
本編は 3 つの部分に分かれる。共通パラメーターは両方のパイプラインで使用できる。続いて各パイプライン固有のパラメーターを挙げる。これらは他方のパイプラインの Details パネルでは表示されない。
共通パラメーター
レンダリングモード
3D Gaussian Splatting(既定値)
2D ガウス楕円としてレンダリングし、完全なカラーと不透明度を持つ。
LCCComponent->SetRenderMode(ERenderMode::Splatting);
点群
各 Splat を 1 つの色付きの点としてレンダリングする。全体を俯瞰する場合やパフォーマンスに制約がある場合に適する。
LCCComponent->SetRenderMode(ERenderMode::PointCloud);

3DGS と点群レンダリングモードを切り替える
点群モードは標高による着色に対応する。
ElevationColorBottom— 最も低い標高のカラーElevationColorTop— 最も高い標高のカラー

点群モードの標高着色の効果
読み込みモード
データは主体と環境の 2 つの部分に分かれており、LoadMode でどちらをレンダリングするか制御する。
| モード | 説明 |
|---|---|
| Both | 主体と環境をレンダリングする(既定値) |
| OnlyMain | 主体のみレンダリングする |
| OnlyEnvironment | 環境のみレンダリングする |
| None | レンダリングしない。データは読み込まれたまま保持される |

LoadMode で主体と環境のレンダリング範囲を切り替える
注:
Noneはレンダリングを止めるだけで、データはビデオメモリを占有したままになる。リソースを解放するにはUnLoad()を呼ぶ。
ライティングモード
Unlit(ライティングを受けない、既定値)
ガウス自身のカラーのみを使用し、シーンの光源とは相互作用しない。
Lit(ライティングを受ける)
ディファードライティングを有効にし、3DGS シーンがディレクショナルライトやポイントライトなどの影響を受けられるようになる。深度と法線の情報が必要になる。
LCCComponent->SetLightMode(ELightMode::Lit);

Unlit と Lit のライティングモードを切り替える
Mip Filter
有効にすると 2D ローパスフィルターと不透明度の補正を組み合わせ、スケールの違いによるちらつきを軽減する。
既定値はデータ形式ごとに異なる。
| 形式 | 既定値 |
|---|---|
.lcc2 / .lcc | オン |
.ply / .spz / .sog | オフ |
単一ファイル形式で既定がオフになっているのは、データ本来のシャープな見た目を保つためである。ちらつきが出る場合は手動でオンにする。
LCCComponent->SetUseMipFilter(true);
球面調和係数(SH)
視点に依存したカラーの変化を与え、ライティングの忠実度を高める。
LCCComponent->SetUseShcoef(true);
要件:
- レンダリングモードが 3DGS であること
- データ自体に SH 係数が含まれていること
データに SH 係数が含まれるかどうかは形式ごとに異なる。
| 形式 | 判定方法 |
|---|---|
.lcc2 / .lcc | データのファイルタイプで決まる。Quality タイプは SH を含み、Portable タイプは含まない |
.ply / .spz / .sog | ファイルタイプの識別子がなく、ファイル内に実際に SH 係数が書き込まれているかで決まる |
データに SH 係数が含まれない場合、このスイッチは Details パネルで使用できない。
SplatScale
各 Splat のクアッドのサイズを制御する。値の範囲は 0.001 ~ 1.0。
小さくすると Splat 1 個が画面を覆う面積が減り、半透明の重なりもそれに応じて減って、ピクセルフィルのコストが下がる。下げすぎると表面に穴が空いたり、明らかに薄くなったりする。これはパフォーマンスチューニングの手段のひとつでもある。詳しくは パフォーマンス最適化ガイド を参照する。
LCCComponent->SetSplatScale(1.0f);

Splat のスケールと 3DGS のグローバル不透明度を設定する
グローバル不透明度
2 つのレンダリングモードにはそれぞれ独立したグローバル不透明度のプロパティがあり、値の範囲はいずれも 0.0 ~ 1.0。
| プロパティ | 対象モード |
|---|---|
| GlobalAlpha | 3DGS |
| GlobalAlpha_PointCloud | 点群 |
LCCComponent->SetGlobalAlpha(1.0f);
LCCComponent->SetGlobalAlpha_PointCloud(1.0f);

点群モードのグローバル不透明度を設定する
カラー調整

LCC の彩度、コントラスト、色味のパラメーターを設定する
実行時の変更に対応する。
| プロパティ | 範囲 | 説明 |
|---|---|---|
| Saturation | 0.0~2.0 | チャンネルの彩度 |
| Contrast | 0.0~2.0 | チャンネルのコントラスト |
| Gamma | 0.0~2.0 | チャンネルのガンマ補正 |
| Offset | -1.0~1.0 | 加算的なカラーオフセット |
| ColorTint | LinearColor | 乗算的な色味 |
LCCComponent->SetSaturation(FVector4(1.2, 1.2, 1.2, 1.0));
LCCComponent->SetColorTint(FLinearColor::White);

カラーパラメーターを動的に調整した後の画面効果
アンチエイリアス
bAffectAntiAliasingMethod を有効にすると、プラグインがアンチエイリアスの方式を自動で管理する。
| 構成 | 既定の方式 |
|---|---|
| LCC1 Splat | FXAA |
| LCC2 Splat | TSR |
| LCC1 Point Cloud | MSAA |
| LCC2 Point Cloud | TSR |
既定値は ProjectSettings > Plugins > LCC4Unreal で変更できる。
注:アンチエイリアスの方式はビュー単位のグローバル設定である。シーンに LCC パイプラインと LCC2 パイプラインの Actor が同時に存在する場合、両者がそれぞれの設定でアンチエイリアスの方式を設定するため、最終的に効くのは実行順序によって決まり、結果は不定になる。このようなシーンでは、設定で両パイプラインのアンチエイリアス方式を手動で一致させる必要がある。

LCC パイプラインごとに既定のアンチエイリアス方式を設定する
後処理

LCC4Unreal の後処理とトーンマッピングのオプションを設定する
| 設定 | 既定値 | 説明 |
|---|---|---|
| Enable Post Process | オン | LCC のピクセルをエンジンの後処理パイプラインに参加させるか |
| Apply Tonemap Inverse | オフ | カラースペース変換時に FilmToneMapInverse を適用し、エンジンのトーンマッピング後もデータ本来の見た目を復元する |
これらはグローバルな設定で、ProjectSettings > Plugins > LCC4Unreal > Rendering にあり、両方のパイプラインに効く。シーン内のすべての LCC コンポーネントが同じモードを共有し、Actor ごとに個別に設定することはできない。
Enable Post Process をオフにしたときの効果
2 つの状態では処理の方法が異なる。
| 状態 | 処理方法 | 結果 |
|---|---|---|
| オン | LCC のピクセルに InverseACES を適用し、エンジンの後処理パイプラインに入れる | 3DGS がシーン内の通常のオブジェクトと一緒にトーンマッピング、Bloom、露出、カラーグレーディングなどの後処理を受ける |
| オフ | トーンマッピング前にスナップショットを保存し、トーンマッピング完了後に Alpha でブレンドして画面に戻す | 3DGS が元のカラーを保ち、トーンマッピングおよびそれ以降の後処理の影響を受けない |
オフはデータ本来のカラーを厳密に再現する必要がある場合、たとえばカラーの検証やリファレンス画像との比較に適する。引き換えに 3DGS とシーン内の通常のオブジェクトの見え方が統一されなくなり、画面全体の後処理効果(Bloom や露出など)が 3DGS の部分には作用しない。
注:Enable Post Process をオフにするには、エンジン側で Alpha チャンネルの出力を有効にする必要がある。有効にしないと合成結果が正しくならない。ProjectSettings > Engine > Rendering で Alpha Output を有効にする(UE 5.4 以前のバージョンでは「Enable alpha channel support in post processing」に相当し、Linear color space only に設定してエディターを再起動する必要がある)。プラグインはこの項目が無効であることを検出すると通知を表示する。
Apply Tonemap Inverse の働き
3DGS データのカラーは、撮影時にすでにトーンマッピングが済んだ完成品のカラーである。この種のカラーがエンジンのトーンマッピングをもう一度通ると二重に圧縮され、通常はコントラストの低下やハイライトのくすみとして現れる。
この項目を有効にすると、プラグインはカラースペース変換の段階で LCC のカラーに FilmToneMapInverse を適用し、エンジンがこの後で行うトーンマッピングを先に打ち消して、最終画面でデータ本来の見た目を復元する。
| 状態 | 適する場面 |
|---|---|
| オフ(既定値) | 3DGS とシーン内の通常のオブジェクトが同じトーンマッピングを通り、全体の見え方を統一する場合 |
| オン | 3DGS にデータ本来のカラーとコントラストを表現させる場合 |
この項目は両方のパイプラインに効き、Enable Post Process がオンのときにのみ意味を持つ。オフの場合は 3DGS がもともとトーンマッピングに参加しないため、打ち消す必要がない。
LCC2 パイプライン固有のパラメーター
深度しきい値
AlphaThreshold は 3DGS が深度バッファにどの層の深度を書き込むかを決める。3DGS は複数層の半透明な splat が重なって構成されており、プラグインは近い側から遠い側へ不透明度を累積し、累積値がこのしきい値に達した時点の深度をそのピクセルの代表深度として記録する。
| 項目 | 値 |
|---|---|
| 値の範囲 | 0.01 ~ 0.99 |
| 既定値 | 0.5 |
下げると深度がカメラ側に寄り、上げると深度がカメラから離れる。この深度はライティング、オクルージョン判定、および深度に依存する後処理に参加するため、Lit モードでの表面の反応や通常のメッシュとの相互オクルージョンもそれに応じて変化する。
下げる必要がある典型的な場面:データ内に不透明度がとても低い薄い構造がある場合、たとえば昆虫や鳥の翼、網、葉の縁など。この種の領域の splat は累積不透明度が既定の 0.5 に届かないため、深度が書き込まれない。シーンにスカイボックスやフォグなど純黒でない背景が同時に存在すると、これらの領域は深度がないために背景色が混ざり込み、構造が薄くなってディテールが失われたように見える。しきい値を下げるとこの種の領域が早めに深度を書き込むようになり、ディテールが復元する。
調整するときは少しずつ下げて観察する。低すぎると深度が全体的にカメラに近づき、オクルージョンの関係と深度に依存する後処理に影響する。
注:このプロパティは Details パネルの Advanced 折りたたみ領域にある。既定値は多くのシーンに適している。
LCC パイプライン固有のパラメーター
影の受光
LCCComponent->bReceiveShadows = true;
注:レンダリングモードが 3DGS である必要がある。有効にするとパフォーマンスへの影響が大きい。

影の受光を有効にした後の 3DGS レンダリング結果
継ぎ目のカット
bEnableSeamCutting は分割レンダリングでノードの境界に生じる継ぎ目をカットするために使う。LCC データのバージョン 5.0 以上では自動的に有効になる。それより古いバージョンのデータで継ぎ目が見える場合は手動でオンにする。
LCCComponent->bEnableSeamCutting = true;
注:このプロパティは Details パネルの Advanced 折りたたみ領域にある。
複数 Actor の半透明ソート
LCC パイプラインは深度を出力しないため、複数の LCC Actor の間では深度テストによる正しい相互オクルージョンを得られず、半透明の描画順で近似するしかない。bEnableMultipleLCCActorAutoSort(既定でオン)は Actor からカメラまでの距離に応じて TranslucentSortPriority を自動設定し、近い Actor を後から描画させることで、多くの場合に妥当な重なりの結果を得る。
このソートの粒度は Actor 単位である。各 Actor は全体としてソートに参加し、splat 単位までは細分化されない。そのため次のような固有の制限がある。
- 2 つの LCC Actor のバウンディングボックスが空間的に交差したり入り込んだりしている場合、1 つの全体的な順序で正しい前後関係を表せないため、交差領域のオクルージョンが誤る
- 単一の Actor 内部が非常に大きな深度範囲にまたがる場合、Actor の中心距離によるソート結果が実際の前後関係と合わないことがある
複数の 3DGS で正しく相互オクルージョンさせる必要がある場合は、LCC2 パイプラインに切り替える。重なりの順序を手動で指定したい場合はこの項目をオフにし、各 Actor の TranslucentSortPriority を自分で設定する。
LCC2 パイプラインにはこのプロパティがない。データを統一 Buffer に集約した後に splat 単位でグローバルにソートし、深度を出力してオクルージョン判定に参加させるため、介入は不要である。