XGRIDSドキュメント
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • Lixel PortalCam シリーズ

    • PortalCam P1

      • 製品概要
      • デバイスの基本操作
      • LCC Scan App の使用
      • メンテナンスとお手入れ
      • FAQ
  • Lixel K シリーズ

    • Lixel K1

      • 製品概要
      • デバイスの基本操作
      • デバイスのアクティベーションと接続
      • デバイス収集
      • 絶対座標のポイントクラウドデータを取得する
      • マップフュージョン
      • 典型的なシーンにおける経路計画の推奨
      • 注意事項
      • FAQ
    • Lixel K2

      • 製品概要
      • デバイスの基本操作
      • デバイスのアクティベーションと接続
      • デバイス収集
      • 絶対座標のポイントクラウドデータを取得
      • マップフュージョン
      • 典型的なシーンにおける経路計画の推奨
      • 注意事項
      • FAQ
  • Lixel L シリーズ

    • Lixel L2 Pro

      • 製品概要
      • デバイスの基本操作
      • デバイスのアクティベーションと接続
      • デバイス収集
      • 絶対座標のポイントクラウドデータを取得する
      • 実時計測機能
      • 付録
      • FAQ
    • Lixel L3

      • 製品概要
      • デバイスの基本操作
      • デバイスのアクティベーションと接続
      • デバイス収集
      • 絶対座標点群データの取得
      • 付録
  • Lixel Studio

    • バージョンと著作権
    • インストールとアクティベーション
    • ソフトウェアインターフェース
    • ファイル操作
    • プロジェクト処理
    • ツール
    • 2D 作図
    • 業界応用
    • 設定
    • デバイス接続
    • よくある質問
  • Lixel CyberColor

    • LCC Studio

      • はじめに
      • バージョンと更新
      • ダウンロードとインストール
      • インターフェース概要とナビゲーション
      • 再構築前の準備
      • モデル再構築
      • 単一モデル再構築
      • 地図合成
      • 空地融合
      • 航空撮影再構築
      • マイモデル
      • その他の機能
      • 設定とアカウント
      • Converter
      • 動画再構築
      • よくある質問 / FAQ
    • LCC Scene Editor

      • バージョンと更新情報
      • アカウントとサインイン
      • 製品概要とホーム画面
      • エディター画面
      • ナビゲーションモード
      • ファイル
      • 設定
      • 編集
      • ウィンドウ
      • グローバルツールバー
      • アセットとプロパティ
      • 左ツールバー
      • ビューポイント
      • ポータル
      • スカイボックス
      • アノテーション
      • 測定
      • フライスルー
      • シーンレポート
      • 3D レイアウト
      • ミニマップ
      • プレビューモード(Viewer)
      • ヘルプ
      • よくある質問(FAQ)
      • スポーンポイント
    • LCC Model Editor

      • バージョンと更新
      • ユーザーガイド
      • 概要とインターフェース
      • ファイル操作
      • セレクター
      • モデルの編集
      • 測定
      • カラーグレーディング
      • アセット管理
      • 設定とヘルプ
      • よくある質問
    • Capture Guide

      • 概要
      • 撮影デバイス概要
      • 一般的な撮影の原則
      • 屋内シーンの撮影
      • 屋外シーンの撮影
      • 大規模撮影(マップフュージョン)
      • 空地マップフュージョン撮影
      • オブジェクト撮影
      • 人物撮影
      • ビデオ再構築撮影
      • HD Enhancement
      • 制御点(Lixel P1)
      • FAQ とトラブルシューティング
    • LCC Studio Linux

      • 製品概要説明
      • 基本アーキテクチャマニュアル
      • インストールと展開説明書
      • コンテナ起動パラメータ説明書
      • CodeMeter オフラインライセンス展開説明書
      • APIコマンドセット
      • 付録-開発者データマニュアル
      • 付録-エラーコード一覧
      • シングルノードマルチGPUクラスタ展開QuickStart
    • 活用テクニック

      • 複数の大規模 3DGS モデルの統合ワークフロー
    • バージョン履歴
  • プラグインと SDK

    • Unreal

      • 概要
      • クイックスタート - Windows
      • クイックスタート - Linux
      • クイックスタート - Quest3
      • エディションとライセンス
      • レンダリング
      • Tiled ラスタライズ(実験的機能)
      • 画面調節
      • 法線とライティング
      • シーン編集
      • パフォーマンスパラメーター
      • パフォーマンス最適化ガイド
      • サードパーティおよびエンジンプラグインとの連携
      • プロキシメッシュ
      • 読み込みアニメーション
      • コリジョン
      • ナビゲーションシステム対応
      • Single layer water 対応
      • ローカライズ
      • よくある質問
      • トラブルシューティング
      • ログと診断
      • お問い合わせ
      • ベストプラクティス

        • LixelStudio メッシュで 3DGS をリライティングする
      • API リファレンス

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • SOG / SPZ / PLY Actors
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enums
        • Structs
      • 更新履歴

        • v3.4.0
        • v3.3.1
        • v3.0.0
        • v2.2.1
        • v1.0.0
        • v0.9.0
        • v0.8.0
        • v0.7.1
        • v0.6.1
        • v0.5.2
        • v0.4.1
        • v0.4.0
        • v0.3.0
        • v0.0.5
        • v0.0.4
        • v0.0.3
        • v0.0.2
        • v0.0.1
    • Unity

      • Unity SDK の概要
      • 技術的特徴
      • 開発環境の要件
      • PC クイックスタートガイド
      • プロジェクト設定の最適化ガイド
      • Pico 4 Ultra 開発ガイド
      • Pico 4 Ultra PC ストリーミングガイド
      • Quest 3 開発ガイド
      • Quest 3 PC ストリーミングガイド
      • OpenXR 開発ガイド
      • Pico 4 Ultra Business Streaming ガイド
      • 用語集
      • FAQ
      • お問い合わせ
      • 機能開発ガイド

        • 複数シーン混合レンダリング開発ガイド
        • 影の受光開発ガイド
        • リアルタイムライティング開発ガイド
        • マルチカメラレンダリング開発ガイド
        • 高解像度画像レンダリング開発ガイド
        • LCC / LCC2 データ形式互換性開発ガイド
        • 読み込みエフェクト開発ガイド
        • Mip レンダリングモード切り替え開発ガイド
        • エッジ・コーナースナップ開発ガイド
        • 投影デカール開発ガイド
        • ビデオ投影デカール開発ガイド
        • ハイライト開発ガイド
        • リアルタイムクリッピング開発ガイド
        • カラー調整開発ガイド
        • シーン Mesh データ取得開発ガイド
        • エディターモード開発ガイド
        • レンダリングパフォーマンスパラメータ設定ガイド
        • アプリケーションとデータの同梱パッケージ開発ガイド
        • コリジョンシステム開発ガイド
        • macOS 開発の権限問題ガイド
        • iOS デバイスのコンパイル・パッケージ化開発ガイド
      • API リファレンス

        • LCCManager
        • Renderer
        • データ型
      • 変更履歴

        • v2.3.0
        • v2.2.10
        • v2.2.0
        • v2.1.19
        • v2.0.14
    • Web

      • はじめに
      • レンダリング性能最適化ガイド
      • グラフィックス設定
      • よくある質問
      • API リファレンス

        • LCCRender::clearIndexDB
        • LCCRender::dispose
        • LCCRender::load
        • LCCRender::setCamera
        • LCCRender::unload
        • LCCRender::update
        • LCCObject::checkRenderNextFrame
        • LCCObject::clearRenderNextFrame
        • LCCObject::ecef2Prj
        • LCCObject::getBounds
        • LCCObject::getEnvInstancedMesh
        • LCCObject::getInstancedMesh
        • LCCObject::getLodInfos
        • LCCObject::getOriginPosition
        • LCCObject::getProjectionCoordinateSystemInfos
        • LCCObject::hasCollision
        • LCCObject::hasEnvironment
        • LCCObject::hasShcoef
        • LCCObject::intersectsCapsule
        • LCCObject::intersectsRayExt
        • LCCObject::intersectsRayFromOriginExt
        • LCCObject::intersectsSphere
        • LCCObject::lowerToBottom
        • LCCObject::prj2Ecef
        • LCCObject::raiseToTop
        • LCCObject::raycast
        • LCCObject::raycastFromOrigin
        • LCCObject::setAlpha
        • LCCObject::setClipBox
        • LCCObject::setClipPlane
        • LCCObject::setEndLod
        • LCCObject::setLodAutoLevelUp
        • LCCObject::setMaxDistance
        • LCCObject::setMaxNodeSplats
        • LCCObject::setMaxSplats
        • LCCObject::setOriginPosition
        • LCCObject::setPointsColor
        • LCCObject::setRenderState
        • LCCObject::setRotation
        • LCCObject::setScale
        • LCCObject::setSemantic
        • LCCObject::setSemanticColor
        • LCCObject::setSmooth
        • LCCObject::setStartLod
        • LCCObject::setTranslation
        • LCCObject::setVisible
        • LCCObject::togglePointsDisplayMode
        • LCCObject::useEnvironment
        • LCCObject::useShcoef
      • 更新履歴

        • v0.6.3
        • v0.6.2
        • v0.6.1
        • v0.6.0
        • v0.5.5
        • v0.5.4
        • v0.5.3
        • v0.5.2
        • v0.5.1
        • v0.5.0
        • v0.4.1
        • v0.4.0
        • v0.3.1
        • v0.3.0
        • v0.2.0

投影デカール開発ガイド

機能概要

デカール投影(Decal Projector)は、スライドプロジェクターのように 2D 画像を 3DGS 点群サーフェスへ投影します。プロジェクターはワールド空間内の固定された透視フラスタムで、フラスタム内の点群はデカールカラーで覆われ、フラスタム外の点群は影響を受けません。デカールはグローバルなシェーディング状態であり、3DGS シーン全体に一貫したシェーディング効果をもたらします。

基本投影に加えて、オクルージョンカリングをオプションで有効化できます。デフォルトではデカールは X 線のような挙動です。3DGS 自体にサーフェスの概念がないため、デカールは前面オブジェクトに遮られた背面まで透過し、3DGS シーン全体を通過します。オクルージョンカリングを有効化すると、プロジェクターに面した前面サーフェスのみが着色され、遮られた背面や遮蔽されたシーンは着色されなくなり、リアルなスライドプロジェクター効果が得られます。

注:

デカールとオクルージョンカリングは PC / Mac(URP パイプライン) でのみ有効です。モバイルや VR プラットフォームで関連インターフェースを呼び出しても SDK は無視し、警告ログを出力します。ビジネス側でプラットフォームチェックを行う必要はありませんが、それらのプラットフォームで効果が表示されることは期待しないでください。

手順 1:シーンと GameObject を作成する

Unity で新しいシーンを作成します。Unity はデフォルトで Main Camera と Directional Light を作成します。

Main Camera をセットアップする

Hierarchy ウィンドウで Main Camera を選択し、Inspector ウィンドウでそのプロパティを以下のとおり設定します。

Main Camera のプロパティを設定

Main Camera のプロパティを設定

LCCManager を作成する

Hierarchy ウィンドウの空の領域を右クリックし、ポップアップメニューから Create Empty を選択して空の GameObject を作成し、LCCManager と名前を付け、その Transform を正規化し、Add Component で LCCManager スクリプトを追加します。

LCCManager GameObject を作成し LCCManager スクリプトを追加

LCCManager GameObject を作成し LCCManager スクリプトを追加

LCCRenderer を作成する

Hierarchy ウィンドウの空の領域を右クリックし、Create Empty を選択して空の GameObject を作成し、LCCRenderer と名前を付け、その Transform を Rotation.x = -90、Scale.x = -1 に設定します。

LCCRenderer を作成し Transform を設定

LCCRenderer を作成し Transform(Rotation.x = -90、Scale.x = -1)を設定

注:

LCCRenderer GameObject の Transform 設定(Rotation.x = -90、Scale.x = -1)は、LCC データ座標系にアライメントするためのものです。座標系アライメントの詳細は Unity SDK の概要 の「LCC データの座標系」を参照してください。

Projector を作成する

Hierarchy ウィンドウの空の領域を右クリックし、Create Empty を選択して Projector という名前の空の GameObject を作成します。この空のオブジェクトを作成する目的は、その Transform コンポーネントを使ってプロジェクターの位置と向きを制御することです。スクリプトコードに関連付けると、実行時にプロジェクターのプロパティを調整できます。プロジェクターは +Z 方向に沿って投影し、そのプロパティは必要に応じて設定できます。

プロジェクターとして Projector 空 GameObject を作成

プロジェクターとして Projector 空 GameObject を作成(+Z が投影方向)

手順 2:Render Feature を追加する

  1. Unity メニューバーで File → Project Settings を選択し、左側の Graphics を選び、現在の Default Render Pipeline Asset を確認します。この例では URP(Universal Render Pipeline Asset)を使用します。
Graphics 設定で Default Render Pipeline Asset を確認

Graphics 設定で Default Render Pipeline Asset を確認

  1. その Asset をクリックし、Project ウィンドウで対応するアセットファイルを特定し、関連付けられた Renderer(この例では URP_Renderer.asset)を見つけます。

  2. その Renderer アセットファイルを選択し、Inspector ウィンドウで Add Renderer Feature をクリックし、Decal Depth Feature を追加します。

URP Renderer に Decal Depth Feature を追加

URP Renderer に Decal Depth Feature を追加

注:

Decal Depth Feature は オクルージョンカリングの前提条件です。基本投影(X 線デカール)のみを使用する場合は追加する必要はありません。ただしオクルージョンカリングを有効化するには、先にこの Feature を URP Renderer Asset に登録する必要があります。さもないとオクルージョン深度マップが生成されず、オクルージョンが有効になりません。

手順 3:スクリプトを書く

Decal.cs という名前の新しい C# スクリプトを作成します。以下の完全なコードは、インテグレーターの視点をシミュレートし、デカール関連の全 7 メソッド(基本投影 5 つ + オクルージョンカリング 2 つ)をカバーしており、プロジェクトへそのままコピーできます。

using LCCCore;
using UnityEngine;

/// <summary>
/// デカール投影 — 最小限の開発者向け使用例。
///
/// このスクリプトは「インテグレータースクリプト」をシミュレートします。LCCManager の公開 API のみを呼び出し、SDK 内部には触れません。
/// デカール API 全 7 つをカバー:
///   基本投影(5): SetDecalEnabled / SetDecalTexture / SetDecalProjection / SetDecalOpacity / SetDecalEdgeFade
///   オクルージョンカリング(2): SetDecalOcclusion / SetDecalOcclusionSettings
///
/// 使用手順:
///   1) 空の GameObject を作成し、このスクリプトをアタッチします;
///   2) Inspector でシーン内の LCCManager を m_manager へドラッグします;
///   3) m_filePath に有効な LCC シーンパスを設定します;
///   4) 投影する画像を m_decalTexture へドラッグします(インポート設定で Read/Write を有効化することを推奨);
///   5) 空のオブジェクトを m_projector へドラッグしてプロジェクターとします(空のままにするとこのオブジェクトを使用)。+Z 軸が投影方向です;
///   6) Play します。シーンの読み込み完了後、デカールが自動的にオンになります。プロジェクターをドラッグすると点群上のデカールをリアルタイムに確認できます。
///
/// プラットフォーム注記:デカールとオクルージョンカリングは PC/Mac(URP)でのみ有効です。モバイル/VR での呼び出しは SDK に無視され、警告としてログ出力されます。
/// </summary>
public class Decal : MonoBehaviour
{
    [Header("必須")]
    [Tooltip("シーン内の LCCManager インスタンス")]
    public LCCManager m_manager;
    [Tooltip("有効な LCC シーンパス")]
    public string m_filePath;
    [Tooltip("投影するデカール画像。RGB=カラー、A=デカール自身のマスク")]
    public Texture2D m_decalTexture;

    [Header("プロジェクター(+Z 方向に投影)")]
    [Tooltip("プロジェクターの姿勢。空の場合はこのオブジェクトの Transform を使用")]
    public Transform m_projector;
    [Range(1f, 179f)] public float m_fov = 60f;
    [Tooltip("投影アスペクト比。<=0 の場合はデカール画像のアスペクト比を自動使用")]
    public float m_aspect = 0f;
    public float m_near = 0.1f;
    public float m_far = 100f;

    [Header("デカールの外観")]
    [Range(0f, 1f)] public float m_opacity = 1.0f;
    [Range(0f, 0.5f)][Tooltip("エッジフェード幅(UV 比)。0 = ハードエッジ")]
    public float m_edgeFade = 0.1f;
    [Tooltip("毎フレーム投影を更新し、実行時にプロジェクターのドラッグやパラメータ調整が可能に")]
    public bool m_updateEveryFrame = true;

    [Header("オクルージョンカリング(PC/Mac のみ)")]
    [Tooltip("オンの場合、前面ジオメトリの背後にある背面/遮蔽点はデカールで着色されなくなります(スライドプロジェクター効果)。オフの場合は X 線です")]
    public bool m_occlusion = false;
    [Range(0f, 1f)][Tooltip("不透明度閾値:この値以上の不透明度を持つ Splat のみが深度マップに寄与し、浮遊/霧状の点を除去します。0 = すべて参加")]
    public float m_occlusionCutoff = 0f;
    [Range(0f, 0.5f)][Tooltip("相対深度許容値。小さすぎる -> 近傍サーフェスの自己オクルージョン、大きすぎる -> X 線着色の漏れ。デフォルト 0.05")]
    public float m_occlusionBias = 0.05f;
    [Range(0, 16)][Tooltip("正方形フットプリント半径の上限(px)。X 線の透過漏れを除去する主なノブ。0 = 単一テクセル、デフォルト 2")]
    public int m_occlusionFootprint = 2;
    [Tooltip("深度マップ解像度(px、2 のべき乗 256〜4096)。かすめ角の穴を埋めるには下げます。デフォルト 1024")]
    public int m_occlusionResolution = 1024;

    // -- 実行時状態 --
    private bool m_loaded;
    private bool m_lastOcclusion;
    private float m_lastCutoff = float.NaN;
    private float m_lastBias = float.NaN;
    private int m_lastFootprint = -1;
    private int m_lastResolution = -1;

    void Start()
    {
        if (m_manager == null || string.IsNullOrEmpty(m_filePath))
        {
            Debug.LogError("[DecalDemo] m_manager または m_filePath が割り当てられていません。");
            enabled = false;
            return;
        }

        // 1) レンダーパイプラインを PC 単一シーンのエディターモードに初期化
        m_manager.SetPlatformType(PlatformType.PC);
        m_manager.SwitchRenderPass(ActiveRenderMode.SingleRender);
        m_manager.SetEditorMode(true);

        // 2) 点群シーンを読み込み、完了後にデカールを有効化(デカールはグローバル状態。シーン準備完了後に設定するのが最も安全)
        var renderer = m_manager.GetRender(this.transform);
        Debug.Log($"[DecalDemo] 読み込みを開始: {m_filePath}");
        renderer.Load(m_filePath,
            _ => { /* 進捗コールバック。この例では未使用 */ },
            OnSceneLoaded);
    }

    private void OnSceneLoaded()
    {
        Debug.Log("[DecalDemo] 読み込み完了、デカール投影を有効化します。");

        // -- 基本投影: 5 つの API --
        m_manager.SetDecalTexture(m_decalTexture);   // デカールの内容
        m_manager.SetDecalOpacity(m_opacity);        // 全体の不透明度
        m_manager.SetDecalEdgeFade(m_edgeFade);      // エッジフェード
        ApplyProjection();                           // プロジェクターの姿勢(内部的に SetDecalProjection を呼び出す)
        m_manager.SetDecalEnabled(true);             // デカールを有効化(_DECAL キーワード)

        // -- オクルージョンカリング: 2 つの API -- ApplyProjection の後でなければならない(深度マップには有効なプロジェクター VP が必要)
        m_manager.SetDecalOcclusionSettings(BuildOcclusionSettings());
        m_manager.SetDecalOcclusion(m_occlusion);
        CacheOcclusionState();

        m_loaded = true;
    }

    /// <summary>
    /// デモ専用です。実際のプロジェクトでは、パフォーマンス向上のため Update() で毎フレーム
    /// SetDecalProjection / SetDecalOpacity / SetDecalEdgeFade を呼び出す必要はありません。
    /// パラメータが変更されたときに対応する API を呼び出すだけで十分です。
    /// </summary>
    void Update()
    {
        if (!m_loaded) return;

        // 実行時にオクルージョンを切り替え
        if (m_occlusion != m_lastOcclusion)
        {
            m_manager.SetDecalOcclusion(m_occlusion);
            m_lastOcclusion = m_occlusion;
        }

        // オクルージョン品質パラメータが変更されたら -> 構造体を一度プッシュ
        if (!Mathf.Approximately(m_occlusionCutoff, m_lastCutoff) ||
            !Mathf.Approximately(m_occlusionBias, m_lastBias) ||
            m_occlusionFootprint != m_lastFootprint ||
            m_occlusionResolution != m_lastResolution)
        {
            m_manager.SetDecalOcclusionSettings(BuildOcclusionSettings());
            CacheOcclusionState();
        }

        // 便利なリアルタイムデバッグのため毎フレームプロジェクター / 外観を更新
        if (!m_updateEveryFrame) return;
        m_manager.SetDecalOpacity(m_opacity);
        m_manager.SetDecalEdgeFade(m_edgeFade);
        ApplyProjection();
    }

    /// <summary>現在のプロジェクター姿勢と透視パラメータから投影行列を構築します。</summary>
    private void ApplyProjection()
    {
        Transform p = m_projector != null ? m_projector : this.transform;
        float aspect = m_aspect > 0f
            ? m_aspect
            : (m_decalTexture != null ? (float)m_decalTexture.width / m_decalTexture.height : 1f);
        m_manager.SetDecalProjection(p.position, p.rotation, m_fov, aspect, m_near, m_far);
    }

    /// <summary>4 つのオクルージョンパラメータを構造体にまとめます。</summary>
    private DecalOcclusionSettings BuildOcclusionSettings()
    {
        return new DecalOcclusionSettings
        {
            opacityCutoff  = m_occlusionCutoff,
            depthBias      = m_occlusionBias,
            footprintMaxPx = m_occlusionFootprint,
            resolution     = m_occlusionResolution,
        };
    }

    private void CacheOcclusionState()
    {
        m_lastOcclusion  = m_occlusion;
        m_lastCutoff     = m_occlusionCutoff;
        m_lastBias       = m_occlusionBias;
        m_lastFootprint  = m_occlusionFootprint;
        m_lastResolution = m_occlusionResolution;
    }

    // -- 便利なデバッグエントリポイント(Inspector 右クリック) --
    [ContextMenu("デカール オン")]  private void DecalOn()  { m_manager?.SetDecalEnabled(true); }
    [ContextMenu("デカール オフ")] private void DecalOff() { m_manager?.SetDecalEnabled(false); }
    [ContextMenu("オクルージョン オン")]  private void OcclusionOn()  { m_occlusion = true;  m_manager?.SetDecalOcclusion(true);  m_lastOcclusion = true; }
    [ContextMenu("オクルージョン オフ")] private void OcclusionOff() { m_occlusion = false; m_manager?.SetDecalOcclusion(false); m_lastOcclusion = false; }
}

注:

デカールは グローバルなシェーディング状態 であり、LCC シーンの読み込み完了後(つまり onComplete コールバック内)に設定する必要があります。

この例では、点群が準備できる前に設定するのを避けるため、SetDecalTexture / SetDecalProjection / SetDecalEnabled を Load の完了コールバック(OnSceneLoaded)に配置しています。

オクルージョンカリング関連の SetDecalOcclusionSettings / SetDecalOcclusion は ApplyProjection(つまり SetDecalProjection)の後 に呼び出す必要があります。オクルージョン深度マップには有効なプロジェクターのビュー・プロジェクション行列が必要だからです。

手順 4:スクリプトをアタッチしてプロパティを設定する

  1. Decal.cs スクリプトを Hierarchy ウィンドウの LCCRenderer GameObject にアタッチします。
  2. Inspector ウィンドウで LCCManager GameObject をスクリプトの Manager プロパティへドラッグします。
  3. Projector GameObject をスクリプトの Projector プロパティへドラッグします。
  4. スクリプトの File Path プロパティに LCC ファイルパスを入力し、デカールテクスチャ画像を Decal Texture プロパティへドラッグします。
  5. その他のプロパティパラメータは必要に応じて調整できます。各プロパティの意味は以下の表のとおりです。
Decal スクリプトの Inspector プロパティ設定

Decal スクリプトの Inspector プロパティ設定

フィールド意味デフォルト値
Managerシーン内の LCCManager インスタンス必須
File Path有効な LCC シーンパス必須
Decal Texture投影するデカール画像。RGB はカラー、A はデカール自身のマスク必須
Projectorプロジェクターの姿勢。+Z が投影方向。空の場合はこのオブジェクトの Transform を使用空
Fovプロジェクターの透視視野角60
Aspect投影アスペクト比。0 以下の場合はデカール画像のアスペクト比から自動計算0(自動)
Near / Farプロジェクターフラスタムの近 / 遠クリッピングプレーン0.1 / 100
Opacityデカール全体の不透明度1
Edge Fadeエッジフェード幅(UV 比)。0 はハードエッジ0.1
Update Every Frame毎フレーム投影を更新。実行時のプロジェクターのドラッグやパラメータ変更に便利チェック
Occlusionオクルージョンカリングを有効にするかどうかオフ
Occlusion Cutoff不透明度閾値。この値以上の不透明度を持つ Splat のみが深度マップに寄与0
Occlusion Bias相対深度許容値0.05
Occlusion Footprint正方形フットプリント半径の上限(px)。X 線の透過漏れを除去する主なノブ2
Occlusion Resolutionオクルージョン深度マップ解像度(px、2 のべき乗 256〜4096)1024

手順 5:実行して効果を確認する

Unity の Play ボタンをクリックします。シーン読み込み完了後、デカールが自動的にオンになります。Update Every Frame にチェックが入っている場合、実行中に Scene ビューでプロジェクターオブジェクトを直接ドラッグすると、3DGS サーフェス上のデカールがリアルタイムに動くのが確認できます。Opacity や Edge Fade などのパラメータ調整も即時反映されます。スクリプトコンポーネントの右クリックメニューには Decal On/Off と Occlusion On/Off の 4 つのショートカットもあり、オン/オフ効果を個別に検証するのに便利です。

実行後に 3DGS サーフェスへ投影されたデカール(基本投影)

実行後に 3DGS サーフェスへ投影されたデカール(基本投影、X 線透過)

オクルージョンカリング有効化後、プロジェクターに面した前面サーフェスのみが着色される

オクルージョンカリング有効化後、プロジェクターに面した前面サーフェスのみが着色される(スライドプロジェクター効果)

FAQ:互換モードを無効にする

Unity の Console ウィンドウにエラーが報告され、デカール効果が表示されない場合は、互換モードを無効にします。Edit → Project Settings → Graphics から設定パネルを開き、URP タブを選択し、Render Graph → Compatibility Mode (Render Graph Disabled) の後ろのチェックボックスにチェックを入れないでください。

Render Graph 互換モードにチェックしない

Render Graph 互換モード(Render Graph Disabled)にチェックしない

オクルージョンカリングと調整

オクルージョンカリングはプロジェクターを設定した後に有効化する必要があります。この例では、シーン読み込み完了コールバックで先に SetDecalProjection を呼び出し、次に SetDecalOcclusionSettings と SetDecalOcclusion を呼び出して、オクルージョン深度マップに有効なプロジェクターのビュー・プロジェクション行列を渡しています。実行時に Inspector の Occlusion チェックボックスをオンにすると、透過していたブロックがカリングされ、プロジェクターに面した前面サーフェスのみが保持されるのが確認できます。

前提条件:

オクルージョンカリングを有効化する前に、Decal Depth Feature が URP Renderer Asset に登録されている必要があります(このプロジェクトではサブアセットとして URP_Renderer.asset に書き込まれています)。登録されていない場合、オクルージョン深度マップは生成されず、オクルージョンは有効になりません。

オクルージョン品質は 4 つのパラメータで制御され、構造体を通じて一度に渡されます。4 つは互いに直交しており、以下の表に従って調整します。

パラメータ効果デフォルト調整の提案
opacityCutoff浮遊 / 霧状の Splat を除去し、オクルージョン面を手前へ引き寄せないようにする0前景にブロック状のノイズが出る場合は適度に上げる。大きすぎると着色漏れが発生
depthBias距離に応じて点群サーフェスの厚みを吸収する相対深度許容値0.05近傍サーフェスに自己オクルージョンノイズが出る場合は上げる。薄い遮蔽物が漏れる場合は下げる
footprintMaxPx前面サーフェスの近傍深度がワールドスケールで疎な隙間を埋める。X 線透過漏れを修正する主なノブ2透過ブロックが残る場合は上げる。輪郭が過剰にオクルージョンされる場合は下げる。0 は単一テクセル
resolutionオクルージョン深度マップ解像度1024かすめ角サーフェスで小ブロックの着色漏れが大きく出る場合は下げる(例:512 / 256)。オクルージョン境界はわずかに粗くなる

重要な手順

投影デカールを実装するための重要な手順は以下のとおりです。

  1. シーンにプロジェクターとして Projector 空オブジェクトを作成します。+Z 軸が投影方向です。
  2. オクルージョンカリングが必要な場合は、URP Renderer に Decal Depth Feature が追加されていることを確認します。
  3. LCC シーンの読み込み完了後に、デカールテクスチャ、外観、プロジェクター姿勢を順に設定し、デカールを有効化します(SetDecalEnabled(true))。
  4. オクルージョンカリングの SetDecalOcclusionSettings / SetDecalOcclusion は SetDecalProjection の後 に呼び出す必要があります。

デカール関連 API

以下のメソッドはすべて LCCManager ファサードクラスにあり、PC / Mac(URP パイプライン)でのみ有効です。モバイル / VR での呼び出しは無視され、警告が出力されます。

SetDecalEnabled

// 戻り値: void
public void SetDecalEnabled(bool enable)

デカール投影を切り替えます。有効にすると、現在キャッシュされている不透明度 / エッジフェードパラメータが GPU にプッシュされ、_DECAL シェーダーキーワードが有効になります。デカールはワールド固定のグローバル状態で、すべてのカメラで一貫しています。内容とプロジェクター姿勢を設定するには SetDecalTexture と SetDecalProjection も呼び出す必要があります。

パラメータ型説明
enableboolデカール投影を有効にするかどうか

使用例:

m_manager.SetDecalEnabled(true);
m_manager.SetDecalTexture(decalTex);
m_manager.SetDecalProjection(projectorPos, projectorRot, 60f, 1.778f, 0.1f, 20f);

注:

  • 無効化しても _DECAL キーワードのみが無効になり、キャッシュされたテクスチャ / パラメータはクリアされません。

SetDecalTexture

// 戻り値: void
public void SetDecalTexture(Texture2D tex)

デカールテクスチャを設定します。RGB はカラー、A はデカール自身のマスクで、グローバル不透明度とエッジフェードに乗算されます。

パラメータ型説明
texTexture2Dデカールテクスチャ

使用例:

m_manager.SetDecalTexture(logoTex);

注:

  • null を渡すとグローバルテクスチャ参照がクリアされます。

SetDecalProjection

// 戻り値: void
public void SetDecalProjection(Vector3 pos, Quaternion rot, float fov, float aspect, float near, float far)

デカールプロジェクターの姿勢と透視パラメータを設定します。プロジェクターは前方向(+Z)に沿って投影し、フラスタム内の点がデカールで覆われます。

パラメータ型説明
posVector3プロジェクターのワールド座標
rotQuaternionプロジェクターの向き
fovfloat垂直 FOV(度)。[1, 179] にクランプ
aspectfloatアスペクト比。最小 1e-4
nearfloat近クリッピングプレーン。最小 1e-3
farfloat遠クリッピングプレーン。最小 near + 1e-3

使用例:

m_manager.SetDecalProjection(new Vector3(0, 10, 0), Quaternion.Euler(90, 0, 0), 60f, 1.778f, 0.1f, 20f);

注:

  • SetDecalOcclusion(true) が既に有効な場合、このメソッドは新しい VP / ビューを Decal Depth Feature へ同期的に転送します。

SetDecalOpacity

// 戻り値: void
public void SetDecalOpacity(float opacity)

デカール全体の不透明度を設定し、即座に GPU へプッシュし、次回 SetDecalEnabled(true) を呼び出したときのためにキャッシュします。

パラメータ型説明
opacityfloatデカール全体の不透明度。範囲 [0, 1]

使用例:

m_manager.SetDecalOpacity(0.8f);

注:

  • 範囲 [0, 1]。範囲外の値は自動でクランプされます。

SetDecalEdgeFade

// 戻り値: void
public void SetDecalEdgeFade(float edgeFade)

デカールのエッジフェード幅を設定します。0 はハードエッジで、値が大きいほどエッジの遷移が柔らかくなります。

パラメータ型説明
edgeFadefloatエッジフェード幅。UV 空間の比。範囲 [0, 0.5)

使用例:

m_manager.SetDecalEdgeFade(0.1f);

注:

  • 範囲 [0, 0.5)。範囲外の値は自動でクランプされます。

SetDecalOcclusion

// 戻り値: void
public void SetDecalOcclusion(bool enable)

デカールのオクルージョンカリング(プロジェクター深度マップに基づく)を切り替えます。影機能とは直交し、独立して切り替えられます。有効化する前に SetDecalProjection でプロジェクターを設定しておく必要があります。さもないと深度マップに有効な VP がありません。

パラメータ型説明
enableboolデカールのオクルージョンカリングを有効にするかどうか

使用例:

m_manager.SetDecalOcclusion(true);

注:

  • URP のみ対応(Built-in パイプラインでの呼び出しは何もせず、ログを出力します)。
  • URP Renderer Asset に Decal Depth Feature が登録されている必要があります。
  • SetDecalOcclusionSettings で設定した品質パラメータに依存します。

SetDecalOcclusionSettings

// 戻り値: void
public void SetDecalOcclusionSettings(DecalOcclusionSettings settings)

デカールのオクルージョンカリングの品質パラメータを一度に設定します(4 項目の意味は下記の構造体と「オクルージョンカリングと調整」の表を参照)。

パラメータ型説明
settingsDecalOcclusionSettingsオクルージョンカリング品質パラメータ

使用例:

m_manager.SetDecalOcclusionSettings(DecalOcclusionSettings.Default);
m_manager.SetDecalOcclusionSettings(new DecalOcclusionSettings {
    opacityCutoff = 0.1f,
    depthBias = 0.05f,
    footprintMaxPx = 2,
    resolution = 1024
});

注:

  • いつでも調整できます。パラメータは即座に GPU と Decal Depth Feature へプッシュされます。
  • resolution を変更すると深度マップ RT の再構築がトリガーされます。

関連データ構造

DecalOcclusionSettings

public struct DecalOcclusionSettings {
    public float opacityCutoff;   // [0,1] Splat が深度マップに参加するための最小不透明度。デフォルト 0(全参加)
    public float depthBias;       // 相対深度許容比率。デフォルト 0.05
    public int   footprintMaxPx;  // 正方形フットプリント半径の上限(px)。0〜16、デフォルト 2
    public int   resolution;      // 深度マップ解像度(px、2 のべき乗、256〜4096)。デフォルト 1024

    public static DecalOcclusionSettings Default { get; } // cutoff=0, bias=0.05, footprint=2, resolution=1024
}

SetDecalOcclusionSettings() で使用します。デフォルト値は DecalOcclusionSettings.Default で取得できます。

フィールド意味デフォルト
opacityCutofffloat、[0,1]、不透明度閾値。この値以上の不透明度を持つ Splat のみ深度マップに参加0
depthBiasfloat、相対深度許容値0.05
footprintMaxPxint、0〜16、正方形フットプリント半径の上限(px)2
resolutionint、2 のべき乗 256〜4096、オクルージョン深度マップ解像度1024

注意事項

  • PC / Mac のみ有効。 モバイルと VR プラットフォームでのデカール関連インターフェースの呼び出しは無視され、警告が出力されます。ビジネス側でプラットフォームチェックを行う必要はありませんが、それらのプラットフォームで効果が表示されることは期待しないでください。
  • デカールはシーン読み込み完了後に設定することを推奨。 デカールはグローバルなシェーディング状態です。この例では、点群が準備できる前に設定するのを避けるため、SetDecalTexture / SetDecalProjection / SetDecalEnabled を Load の完了コールバックに配置しています。
  • オクルージョンカリングは 2 つの前提条件に依存。 第一に、URP Renderer Asset に Decal Depth Feature が登録されていること。第二に、プロジェクターを設定する SetDecalProjection が呼び出されていること。どちらかが欠けてもオクルージョンは有効になりません。
  • 静的投影の追加オーバーヘッドはほぼゼロ。 オクルージョン深度マップはプロジェクター姿勢または点群が変化したときのみ再計算されます。プロジェクターが静止している場合は、フレームごとの追加計算はありません。