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

調色開發指南

LCC Unity SDK 支持對 3DGS 場景進行高亮、裁剪、調色等編輯操作。本文介紹調色相關操作:通過 2D 投影紋理、3D 幾何體或二者混合的方式圈選區域,對選中區域調整亮度、飽和度、對比度,支持正選、反選等操作。

注意:

當前調色功能僅是運行時的顯示效果,不會對原始數據文件產生任何修改,也不支持將編輯結果保存導出。如果需要調色、裁剪並保存數據,請使用其域創新(XGrids)LCC Editor 軟件工具處理。

如果不希望修改數據,也可以將操作記錄下來,下次在數據加載完成後重放操作(執行設置)。

前置條件

通過 SDK 對場景進行調色,需要滿足以下條件:

  1. 在加載數據之前進入編輯狀態。 SDK 默認處於瀏覽狀態(View),該狀態能提供最佳性能,正常瀏覽時建議保持。要進行調色等編輯操作,需在 Load 數據之前通過 SetEditorMode(true) 切換到編輯狀態。該方法只在加載所有數據之前調用才有效。
  2. 在數據加載完成後再執行調色操作。 調色接口需要在場景數據完全加載後調用。

步驟 1:搭建場景

在場景中準備好調色所需的遊戲對象:

  • Main Camera:場景相機,2D 調色會用到它的視圖與投影矩陣。
  • LCCManager:空遊戲對象,Transform 歸一,添加 LCCManager 腳本。
  • LCCRenderer:空遊戲對象,Transform 設置為 Rotation.x = -90、Scale.x = -1(與 LCC 數據座標系對齊),用於掛載後面編寫的 Tone 腳本。
  • 3D 選區幾何體(可選):用於 3D 調色的輔助對象,示例中準備了一個 Cube(Box1),移動、縮放它即可控制 3D 調色選區的位置和大小。

注意:

渲染相機、LCCManager、LCCRenderer 遊戲對象(GameObject)相關設置請參照PC 快速開發入門指南、工程設置優化指南 相關章節。

步驟 2:了解數據結構

調色使用 ToneMix 數據結構,可同時描述 2D 紋理選區和 3D 幾何體選區,並攜帶調色參數。用到的枚舉和結構體如下。

public enum SelectMode    { normal, invert, clip }  // 正常選區、反選、實時裁剪
public enum OperationMode { normal, erase }         // 正常選區、擦除選區
public enum ShapeType     { box, sphere }           // 3D Box 選區、3D Sphere 選區
public enum EditType      { Edit2D, Edit3D }        // 2D 編輯、3D 編輯

// 調色選區
public struct ToneMix
{
    public EditType editType;       // 編輯類型(必填,決定使用 2D 還是 3D 字段)
    public Texture2D texture;       // 2D 蒙版紋理(Edit2D 使用)
    public Matrix4x4 mv;            // 相機視圖矩陣(Edit2D 使用)
    public Matrix4x4 mvp;           // 相機視圖投影矩陣(Edit2D 使用)
    public ShapeType type;          // 幾何體類型(Edit3D 使用)
    public Matrix4x4 invMat;        // 幾何體逆變換矩陣(Edit3D 使用)
    public OperationMode operation; // 操作類型(Edit3D 使用)
    public SelectMode mode;         // 選擇模式(必填)

    public float brightness;        // 亮度,範圍 [0, 3],默認 1.0
    public float saturation;        // 飽和度,範圍 [0, 3],默認 1.0
    public float contrast;          // 對比度,範圍 [0, 3],默認 1.0
    public int lutid;               // LUT 表索引(預留),0 表示不使用
}

關於調色列表,有三點需要注意:

  1. 列表是有序的。 無論 2D 還是 3D,列表中的條目按順序依次生效,請確保添加順序符合預期。
  2. 反選(invert)必須攜帶調色數據。 這是調色與高亮、裁剪最關鍵的不同之處——高亮、裁剪的反選是純指令,可不關聯數據;而調色的反選條目除了 mode = SelectMode.invert,還必須設置 brightness、saturation、contrast,用於指定選區之外區域的調色效果。
  3. 單個列表的條目數量上限為 255。 超出會返回錯誤碼。

步驟 3:了解調色 API

調色相關接口都由 LCCManager 提供,包含一個 SetTone 方法和一個退出方法。

SetTone

// 返回值:int
// 0:執行成功
// 1:列表為 null 或元素個數為 0
// 2:列表元素超出最大值 255
public int SetTone(List<ToneMix> _Mix)

對選定區域進行調色處理,支持亮度、飽和度、對比度調整。2D 紋理條目與 3D 幾何體條目可在同一個列表中混合使用。

QuitToneMode

// 返回值:void
public void QuitToneMode()

退出調色模式,恢復場景原始色彩。

提示:

切換調色參數或清除當前調色時,先調用 QuitToneMode() 再設置新的調色。

步驟 4:2D 蒙版紋理規範

2D 調色通過一張蒙版紋理來描述選區,可支持四邊形、三角形、筆刷、套索等各種圈選方式——在紋理上把對應像素標記為選中值即可。使用 2D 操作時應鎖定相機,在固定視角下標識紋理。紋理和像素值有如下約定:

  • 紋理規格固定為 1024 × 1024,R8 單通道,不生成 Mipmap,使用點濾波(FilterMode.Point),採樣夾斷(TextureWrapMode.Clamp)。
  • 像素值約定:
像素值含義
128默認(未選中)
240選中
180減選(擦除已選區域)
0裁剪

在調色場景下,通常只用到 128(默認)和 240(選中)兩個值。

步驟 5:編寫腳本

新建一個 C# 腳本,命名為 Tone.cs。先完成基礎框架:在 Start 中進入編輯狀態並加載數據,加載完成後置位加載標記,供後續調色方法判斷。

using LCCCore;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Tone : MonoBehaviour
{
    public LCCManager m_manager;
    public string m_FilePath;
    public GameObject m_Box1;
    public Slider m_brightness;
    public Slider m_saturation;
    public Slider m_contrast;

    private LCCCore.Renderer m_renderer;
    private Camera m_camera;
    private bool m_isLoaded = false;

    void Start()
    {
        m_camera = Camera.main;
        m_manager.SetPlatformType(PlatformType.PC);

        // 進入編輯狀態,必須在 Load 之前調用
        m_manager.SetEditorMode(true);

        m_renderer = m_manager.GetRender(this.transform);
        if (m_renderer == null)
            Debug.LogError("GetRender failed, check if the manager is set correctly and the file path is valid.");

        m_renderer.Load(m_FilePath, onLoadProgress, onLoadCallback);
    }

    private void onLoadProgress(float value)
    {
        Debug.Log($"loading progress: {value}");
    }

    private void onLoadCallback()
    {
        Debug.Log("data loaded !!!");
        m_isLoaded = true;
    }

    // 調色方法見下文
}

注意:

SetEditorMode(true) 必須在 Load 之前調用才有效;而 SetTone 必須在數據加載完成(onLoadCallback 回調觸發)之後調用。m_brightness、m_saturation、m_contrast 三個 Slider 用於在運行時動態調整調色參數,可按需使用。

步驟 6:掛載腳本並設置屬性

  1. 將 Tone.cs 腳本掛載到 LCCRenderer 遊戲對象上。
  2. 在 Inspector 窗口中,將 LCCManager 遊戲對象拖動到腳本的 Manager 屬性上。
  3. 在 File Path 屬性中填寫 LCC 文件的路徑地址。
  4. 將場景中的 Box1 拖動到腳本的 Box1 屬性上,將三個 Slider 分別拖動到 Brightness、Saturation、Contrast 屬性上,用於 3D 調色與運行時參數調整。
在 Inspector 中設置 Tone 腳本的屬性

在 Inspector 中設置 Tone 腳本的屬性

步驟 7:調色操作示例

將下面的方法補充到 Tone 類中,並在運行、數據加載完成後調用對應方法。

正常調色

構造一張 R8 蒙版紋理,把要調色的像素標記為 240、其餘標記為 128,再用相機矩陣構造 ToneMix,設置 brightness、saturation、contrast 後加入列表。

public void onTone()
{
    // 紋理尺寸固定 1024*1024,其它屬性保持與示例一致
    Texture2D _texture = new Texture2D(1024, 1024, TextureFormat.R8, false);
    _texture.filterMode = FilterMode.Point;
    _texture.wrapMode = TextureWrapMode.Clamp;

    int _count = 1024 * 1024;
    int _half = _count / 2;
    byte[] _values = new byte[_count];
    for (int i = 0; i < _count; i++)
    {
        if (i < _half)
            _values[i] = 128;    // 128 表示默認,240 表示選中,0 表示裁剪
        else
            _values[i] = 240;
    }
    _texture.SetPixelData(_values, 0);

    List<ToneMix> _tMixs = new List<ToneMix>();
    ToneMix _tmix01 = new ToneMix();
    _tmix01.editType = EditType.Edit2D;
    _tmix01.mv = m_camera.worldToCameraMatrix * this.transform.localToWorldMatrix;
    _tmix01.texture = _texture;
    _tmix01.mode = SelectMode.normal;
    _tmix01.mvp = GL.GetGPUProjectionMatrix(m_camera.projectionMatrix, true) * m_camera.worldToCameraMatrix * this.transform.localToWorldMatrix;
    _tmix01.brightness = 2.0f;
    _tmix01.saturation = 2.0f;
    _tmix01.contrast = 0.4f;
    _tMixs.Add(_tmix01);

    m_manager.SetTone(_tMixs);
}

代碼解釋 : 構建了一張紋理蒙板,將屏幕上半區域選中(屏幕以左下角為原點),對選中區域應用亮度 2.0、飽和度 2.0、對比度 0.4 的調色,示例效果如下。

在實際使用時,可使用矩形框、三角形、筆刷、套索等各種圈選工具對蒙板對應位置進行選擇,也可通過 Slider 動態傳入 brightness、saturation、contrast 的值。

正常調色效果

正常調色效果

反選調色

調色的反選與高亮、裁剪不同:反選條目除了設置 mode = SelectMode.invert,還必須攜帶調色數據(brightness、saturation、contrast),用於指定選區之外區域的調色效果。在上面正常調色的基礎上,追加一個反選條目即可。

public void onToneInvert()
{
    // 紋理尺寸固定 1024*1024,其它屬性保持與示例一致
    Texture2D _texture = new Texture2D(1024, 1024, TextureFormat.R8, false);
    _texture.filterMode = FilterMode.Point;
    _texture.wrapMode = TextureWrapMode.Clamp;

    int _count = 1024 * 1024;
    int _half = _count / 2;
    byte[] _values = new byte[_count];
    for (int i = 0; i < _count; i++)
    {
        if (i < _half)
            _values[i] = 128;    // 128 表示默認,240 表示選中,0 表示裁剪
        else
            _values[i] = 240;
    }
    _texture.SetPixelData(_values, 0);

    List<ToneMix> _tMixs = new List<ToneMix>();

    // 正常選區調色
    ToneMix _tmix01 = new ToneMix();
    _tmix01.editType = EditType.Edit2D;
    _tmix01.mv = m_camera.worldToCameraMatrix * this.transform.localToWorldMatrix;
    _tmix01.texture = _texture;
    _tmix01.mode = SelectMode.normal;
    _tmix01.mvp = GL.GetGPUProjectionMatrix(m_camera.projectionMatrix, true) * m_camera.worldToCameraMatrix * this.transform.localToWorldMatrix;
    _tmix01.brightness = 2.0f;
    _tmix01.saturation = 2.0f;
    _tmix01.contrast = 0.4f;
    _tMixs.Add(_tmix01);

    // 反選:必須攜帶調色數據(brightness/saturation/contrast),不是純指令
    ToneMix _tmix02 = new ToneMix();
    _tmix02.editType = EditType.Edit2D;
    _tmix02.mode = SelectMode.invert;
    _tmix02.brightness = 0.5f;
    _tmix02.saturation = 0.5f;
    _tmix02.contrast = 2.0f;
    _tMixs.Add(_tmix02);

    m_manager.SetTone(_tMixs);
}

代碼解釋 : 在正常調色的基礎上追加了一個反選條目,為選區之外的區域應用亮度 0.5、飽和度 0.5、對比度 2.0 的調色。這樣選區內外可應用不同的調色參數,示例效果如下。

反選調色效果

反選調色效果

注意:

高亮、裁剪的反選是純指令,追加一個 mode = SelectMode.invert 的條目即可,無需其它數據;而調色的反選條目必須同時設置 brightness、saturation、contrast,否則反選區域會使用默認值(1.0),達不到預期效果。

步驟 8:退出調色

調用 QuitToneMode() 即可清除當前調色,恢復場景原始色彩。

public void onToneClear()
{
    m_manager.QuitToneMode();
}

關鍵步驟

對 3DGS 場景進行調色的關鍵步驟:

  1. 在 Load 數據之前調用 SetEditorMode(true) 進入編輯狀態。
  2. 在數據加載完成後(onLoadCallback 回調觸發 或者通過按鈕/事件觸發)再調用 SetTone。
  3. 通過 ToneMix 的 brightness、saturation、contrast(範圍 [0, 3],默認 1.0)控制調色效果,並保證調色列表的添加順序符合預期。
  4. 2D 蒙版紋理固定為 1024 × 1024、R8 單通道,按約定填充像素值(128 默認、240 選中)。
  5. 調色的反選(SelectMode.invert)必須攜帶 brightness、saturation、contrast 數據,這是與高亮、裁剪反選的關鍵差異。
  6. 需要清除或切換調色時,先調用 QuitToneMode()。