XGRIDS文檔
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 靈視 P 系列

    • 靈視 P1

      • 產品概述
      • 設備基本操作
      • 使用 LCC Scan App
      • 維護及保養
      • 常見問題
  • 靈光 K 系列

    • 靈光 K1

      • 產品概述
      • 設備基本操作
      • 設備激活與連接
      • 設備採集
      • 獲取絕對座標點雲數據
      • 地圖融合
      • 典型場景路線規劃建議
      • 注意事項
      • 常見問題
    • 靈光 K2

      • 產品概述
      • 設備基本操作
      • 設備激活與連接
      • 設備採集
      • 獲取絕對座標點雲數據
      • 地圖融合
      • 典型場景路線規劃建議
      • 注意事項
      • 常見問題
  • 靈光 L 系列

    • 靈光 L2 Pro

      • 產品概述
      • 設備基本操作
      • 設備激活與連接
      • 設備採集
      • 獲取絕對座標點雲數據
      • 實時測量功能
      • 附錄
      • 常見問題
    • 靈光 L3

      • 產品概述
      • 設備基本功能
      • 設備激活與連接
      • 設備採集
      • 獲取絕對座標點雲數據操作流程
      • 附錄
  • 配件

    • 補光燈

      • 安裝指導
      • 基本操作
      • 常見問題
  • Lixel Studio

    • 版權
    • 安裝與激活
    • 界面說明
    • 文件
    • 工程處理
    • 工具
    • 平面繪製
    • 行業應用
    • 設置
    • 設備感知
    • 常見問題 / FAQ
  • Lixel CyberColor

    • LCC Studio

      • 入門
      • 版本與更新
      • 下載及安裝
      • 介面概覽及導覽
      • 重建前準備
      • 模型重建
      • 單模型重建
      • 地圖融合
      • 空地融合
      • 航拍重建
      • 我的模型
      • 其他功能
      • 設定與帳戶
      • 設置與賬號
      • Converter
      • 影片重建
      • 視頻重建
      • 常見問題
    • LCC Scene Editor

      • 版本與更新
      • 賬號與登錄
      • 產品概覽與主頁
      • 編輯器界面介紹
      • 三種場景漫游快捷操作
      • 文件
      • 設置
      • 編輯操作
      • 窗口
      • 全局工具欄
      • 資產與屬性
      • 左側工具欄
      • 視點
      • 跳轉點
      • 天空盒
      • 標注
      • 測量
      • 場景漫游
      • 場景報告
      • 智能戶型圖(3D Layout)
      • 小地圖
      • 預覽模式(Viewer)
      • 幫助
      • 常見問題 / FAQ
      • 出生點
    • LCC Model Editor

      • 版本與更新
      • 新手指引
      • 概覽與界面
      • 文件操作
      • 選擇器
      • 編輯操作
      • 測量
      • 調色
      • 資產管理
      • 設置與幫助
      • 常見問題 / FAQ
    • 採集指南

      • 概述
      • 採集設備總覽
      • 通用採集原則
      • 室內場景採集
      • 室外場景採集
      • 大場景採集(地圖融合)
      • 空地融合採集
      • 物體採集
      • 人物採集
      • 影片重建採集
      • 高清補拍
      • 控制點(靈視 P1)
      • 常見問題與排查
    • LCC Studio Linux

      • 產品概要說明
      • 基本架構說明書
      • 安裝部署說明書
      • 容器啟動參數說明書
      • CodeMeter離線授權部署說明書
      • API指令集說明書
      • 附錄-開發者數據說明書
      • 附錄-錯誤碼列表
      • 單機多卡集群部署QuickStart
    • 使用技巧

      • 多個大型 3DGS 模型融合工作流
    • 歷史版本
  • Plugin & SDK

    • Unreal

      • 介紹
      • 快速入門 - Windows
      • 快速入門 - Linux
      • 快速入門 - Quest3
      • 版本與授權
      • 渲染
      • Tiled 光柵化(實驗性)
      • 畫面調節
      • 法線與光照
      • 場景編輯
      • 性能參數說明
      • 性能優化指南
      • 第三方與引擎插件集成
      • 代理網格
      • 加載動畫
      • 碰撞
      • 尋路系統支持
      • 單層水支持
      • 本地化
      • 常見問題
      • 故障排查
      • 日誌與診斷
      • 聯繫我們
      • 最佳實踐

        • 用 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 企業串流指南
      • 術語表
      • 常見問題
      • 聯絡我們
      • 功能開發指南

        • 多場景混合渲染開發指南
        • 陰影接收開發指南
        • 實時光照開發指南
        • 多相機渲染開發指南
        • 高清圖像渲染開發指南
        • 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:創建場景與遊戲對象

在 Unity 中創建一個全新的場景,Unity 默認會創建 Main Camera 和 Directional Light。

設置 Main Camera

在 Hierarchy 窗口中選擇 Main Camera,在 Inspector 窗口中按下圖設置其屬性。

設置 Main Camera 的屬性

設置 Main Camera 的屬性

創建 LCCManager

在 Hierarchy 窗口空白處單擊鼠標右鍵,在彈出的菜單中選擇 Create Empty,創建一個空遊戲對象,命名為 LCCManager,將其 Transform 歸一,並通過 Add Component 為其添加 LCCManager 腳本。

創建 LCCManager 遊戲對象並添加 LCCManager 腳本

創建 LCCManager 遊戲對象並添加 LCCManager 腳本

創建 LCCRenderer

在 Hierarchy 窗口空白處單擊鼠標右鍵,選擇 Create Empty,創建一個空遊戲對象,命名為 LCCRenderer,將其 Transform 設置為 Rotation.x = -90、Scale.x = -1。

創建 LCCRenderer 並設置 Transform

創建 LCCRenderer 並設置 Transform(Rotation.x = -90、Scale.x = -1)

注意:

LCCRenderer 遊戲對象的 Transform 設置(Rotation.x = -90、Scale.x = -1)是與 LCC 數據座標系的對齊。關於座標系對齊的詳細說明,參見 Unity SDK 簡介 中的「LCC 數據座標系」。

創建 Projector

在 Hierarchy 窗口空白處單擊鼠標右鍵,選擇 Create Empty,創建一個空遊戲對象,命名為 Projector。創建該空對象的目的是使用其 Transform 組件來控制投影儀的位置、方向等屬性;將其關聯到腳本代碼後,可在運行時調整投影儀屬性。投影儀沿其 +Z 方向投影,其屬性可根據需要設置。

創建 Projector 空遊戲對象作為投影儀

創建 Projector 空遊戲對象作為投影儀(+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 光式貼花),可不添加;但要開啟遮擋剔除,則必須先在 URP Renderer Asset 中註冊該 Feature,否則遮擋深度圖不會生成,遮擋不生效。

步驟 3:編寫腳本

新建一個 C# 腳本,命名為 Decal.cs。下面的完整代碼模擬接入方視角,覆蓋全部 7 個貼花相關方法(5 個基礎投影 + 2 個遮擋剔除),可直接複製到工程使用。

using LCCCore;
using UnityEngine;

/// <summary>
/// Decal 貼花投影 —— 開發者最小使用示例。
///
/// 本腳本模擬"接入方腳本",只調用 LCCManager 的 public API,不觸碰 SDK 內部。
/// 覆蓋全部 7 個貼花 API:
///   基礎投影(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 忽略並打印 LogWarning。
/// </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("opacity 閾值: 僅 opacity ≥ 此值的 splat 參與深度圖,濾浮點/霧狀點。0=全部參與")]
    public float m_occlusionCutoff = 0f;
    [Range(0f, 0.5f)][Tooltip("相對深度容差。過小→近面自遮擋; 過大→漏擋穿透。默認 0.05")]
    public float m_occlusionBias = 0.05f;
    [Range(0, 16)][Tooltip("方形足跡半徑上限(px),去穿透漏染主旋鈕。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 keyword)

        // ── 遮擋剔除: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("Decal On")]  private void DecalOn()  { m_manager?.SetDecalEnabled(true); }
    [ContextMenu("Decal Off")] private void DecalOff() { m_manager?.SetDecalEnabled(false); }
    [ContextMenu("Occlusion On")]  private void OcclusionOn()  { m_occlusion = true;  m_manager?.SetDecalOcclusion(true);  m_lastOcclusion = true; }
    [ContextMenu("Occlusion Off")] 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 遊戲對象上。
  2. 在 Inspector 窗口中,將 LCCManager 遊戲對象拖動到腳本的 Manager 屬性上。
  3. 將 Projector 遊戲對象拖動到腳本的 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 Cutoffopacity 閾值,僅 opacity 不低於該值的 splat 參與深度圖0
Occlusion Bias相對深度容差0.05
Occlusion Footprint方形足跡半徑上限(px),去穿透漏染主旋鈕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 四個快捷入口,便於單獨驗證開關效果。

運行後貼花投影到 3DGS 表面(基礎投影)

運行後貼花投影到 3DGS 表面(基礎投影,X 光式穿透)

開啟遮擋剔除後只有正對投影儀的前表面被染色

開啟遮擋剔除後,只有正對投影儀的前表面被染色(幻燈機效果)

常見問題:關閉兼容模式

如果 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 勾選打開,即可看到穿透塊被剔除、只保留正對投影儀的前表面。

前提:

開啟遮擋剔除前,URP Renderer Asset 中必須已註冊 Decal Depth Feature(本工程已作為子資源寫入 URP_Renderer.asset)。若未註冊,遮擋深度圖不會生成,遮擋不會生效。

遮擋質量由四個參數控制,通過一個結構體一次性下發。四者相互正交,按下表調節:

參數作用默認調節建議
opacityCutoff過濾漂浮 / 霧狀 splat,避免它們把遮擋面拉近0前景出現塊狀噪點時適度調大;調太大會漏染
depthBias相對深度容差,按距離吸收點雲表面厚度0.05近面出現自遮擋噪點時調大;薄遮擋物漏擋時調小
footprintMaxPx前表面近深度按世界尺度蓋滿稀疏縫隙,根治穿透漏染(主旋鈕)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 shader keyword。貼花是世界固定的全局狀態,對所有相機一致。需另外調用 SetDecalTexture 與 SetDecalProjection 設置內容與投影儀位姿。

參數類型說明
enablebool是否開啟貼花投影

調用示例:

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

說明:

  • 關閉時僅禁用 _DECAL keyword,不清空已緩存的紋理 / 參數。

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)

設置貼花投影儀的位姿與透視參數,投影儀沿其 forward(+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 / view 轉發給 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 支持(內置管線調用直接 no-op 並打印日誌)。
  • 需要 Decal Depth Feature 已註冊在 URP Renderer Asset 中。
  • 依賴 SetDecalOcclusionSettings 配置的質量參數。

SetDecalOcclusionSettings

// 返回值:void
public void SetDecalOcclusionSettings(DecalOcclusionSettings settings)

一次性設置貼花遮擋剔除的全部質量參數(四項含義見下方結構體與「遮擋剔除與調參」表)。

參數類型說明
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 參與深度圖的最低 opacity,默認 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],opacity 閾值,僅不低於該值的 splat 參與深度圖0
depthBiasfloat,相對深度容差0.05
footprintMaxPxint,0~16,方形足跡半徑上限(px)2
resolutionint,2 的冪 256~4096,遮擋深度圖分辨率1024

注意事項

  • 僅 PC / Mac 生效。 移動端與 VR 平台調用貼花相關接口會被忽略並打印警告,無需在業務側做平台判斷,但也不要期望在這些平台看到效果。
  • 建議在場景加載完成後再設置貼花。 貼花是全局着色狀態,示例把 SetDecalTexture / SetDecalProjection / SetDecalEnabled 放在 Load 完成回調裡,避免點雲尚未就緒時設置。
  • 遮擋剔除依賴兩個前提。 一是 URP Renderer Asset 已註冊 Decal Depth Feature,二是已調用過 SetDecalProjection 設定投影儀;兩者缺一則遮擋不生效。
  • 靜態投影幾乎零額外開銷。 遮擋深度圖僅在投影儀位姿或點雲發生變化時重算,投影儀靜止時不產生額外的每幀計算。