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

      • 入门
      • 版本与更新
      • 下载与安装
      • 界面概览与导航
      • 重建前工作
      • 模型重建
      • 单模型重建
      • 地图融合
      • 空地融合
      • 航拍重建
      • 我的模型
      • 其他功能
      • 设置与账号
      • 转换工具
      • 视频重建
      • 常见问题 / FAQ
    • 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
    • X-Brain

      • 产品概述
      • 硬件接口
      • 快速开始
      • 核心概念
      • 集成指南
      • API 参考
      • 数据类型
      • ROS2 桥接
      • 示例程序
      • 部署与网络
      • 排障与 FAQ
      • 版本与发布
    • 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
    • Lixel OpenAPI

      • 概述
      • 连接与鉴权
      • 消息模型与编解码
      • 接口清单
      • 实时数据
      • 项目文件访问
      • 错误码
      • Python

        • 快速开始
        • 客户端封装与工具
        • 常见问题
      • C++

        • 快速开始
        • 客户端与示例
        • 常见问题

实时光照开发指南

LCC Unity 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 数据坐标系」。

步骤 2:编写脚本下发光源

新建一个 C# 脚本,命名为 Relighting.cs,代码如下:

using System.Collections.Generic;
using LCCCore;
using Unity.Mathematics;
using UnityEngine;

public class Relighting : MonoBehaviour
{
    public LCCManager m_manager;
    public string m_FilePath;
    private LCCCore.Renderer m_renderer;

    [Header("Point Light Settings")]
    public Vector3 pointLightPosition = new Vector3(0, 2, 0);
    public Color pointLightColor = Color.red;
    public float pointLightIntensity = 2.0f;
    public float pointLightRange = 3.0f;

    [Header("Spot Light Settings")]
    public Vector3 spotLightPosition = new Vector3(0, 2, -2);
    public Vector3 spotLightDirection = new Vector3(0, -1, 0);
    public Color spotLightColor = new Color(0.1f, 0.9f, 0.7f);
    public float spotLightIntensity = 3.0f;
    public float spotLightRange = 20.0f;
    public float spotLightAngle = 45.0f;

    [Header("Animation")]
    public bool animateLights = true;
    public float rotateSpeed = 30.0f;

    private List<PointLightData> m_lights = new List<PointLightData>();
    private float m_angle;

    void Start()
    {
        m_manager.SetPlatformType(PlatformType.PC);
        m_manager.SwitchRenderPass(ActiveRenderMode.SingleRender);
        m_manager.SetMainCamera(Camera.main);

        m_renderer = m_manager.GetRender(this.transform);
        m_renderer.Load(m_FilePath, onProgress, onComplete);
    }

    private void onProgress(float _progress)
    {
        Debug.Log($"[Relighting] load progress: {_progress:P1}");
    }

    private void onComplete()
    {
        Debug.Log("[Relighting] load complete, setting up lights");
        //m_manager.SetLightIntensity(0.5f);
        ApplyLights();
    }

    void Update()
    {
        if (!animateLights) return;

        m_angle += rotateSpeed * Time.deltaTime;
        ApplyLights();
    }

    private void ApplyLights()
    {
        m_lights.Clear();

        float rad = m_angle * Mathf.Deg2Rad;
        float px = pointLightPosition.x + Mathf.Cos(rad) * 3f;
        float pz = pointLightPosition.z + Mathf.Sin(rad) * 3f;

        // lightType 0 = 点光源
        m_lights.Add(new PointLightData
        {
            position = new float3(px, pointLightPosition.y, pz),
            lightType = 0,
            color = new float3(pointLightColor.r, pointLightColor.g, pointLightColor.b),
            intensity = pointLightIntensity,
            direction = float3.zero,
            range = pointLightRange,
            spotAngle = 0f,
            pad = float3.zero
        });

        // lightType 1 = 聚光灯
        Vector3 dir = spotLightDirection.normalized;
        m_lights.Add(new PointLightData
        {
            position = new float3(spotLightPosition.x, spotLightPosition.y, spotLightPosition.z),
            lightType = 1,
            color = new float3(spotLightColor.r, spotLightColor.g, spotLightColor.b),
            intensity = spotLightIntensity,
            direction = new float3(dir.x, dir.y, dir.z),
            range = spotLightRange,
            spotAngle = spotLightAngle,
            pad = float3.zero
        });

        int result = m_manager.SetLights(m_lights);
        if (result != 0)
            Debug.LogWarning($"[Relighting] SetLights failed: {result}");
    }

    void OnDisable()
    {
        // 传入 null 关闭自定义光照
        m_manager.SetLights(null);
    }
}

注意:

  • 实时光照需要在 LCC 场景加载完成后下发,因此首次 ApplyLights() 在 onComplete 回调中调用。
  • 本示例在 Update 中每帧刷新光源位置,实现点光源绕圆周运动的动画效果。
  • 光源字段类型为 Unity.Mathematics.float3,需要 using Unity.Mathematics;;color 只有 RGB 三个分量,没有 alpha。

步骤 3:挂载脚本并设置数据路径

  1. 将 Relighting.cs 脚本挂载到 Hierarchy 窗口中的 LCCManager 游戏对象上。
  2. 在 Inspector 窗口中,将 LCCManager 游戏对象拖动到脚本的 Manager 属性上。
  3. 在脚本的 File Path 属性中填写 LCC 文件的路径地址。
  4. 其余点光源、聚光灯、动画相关的属性可自由设置。
挂载 Relighting 脚本并设置属性

挂载 Relighting 脚本并在 Inspector 中设置属性

在本示例中,创建了一个点光源和一个聚光灯光源,并让点光源绕圆周运动,用于演示实时光照效果。

步骤 4:运行

在 Game 窗口中点击 Play 按钮,即可看到场景中的实时光照效果。

运行后 3DGS 场景中的实时光照效果

运行后 3DGS 场景中的实时光照效果

3DGS 光照的特殊性

3DGS 中的光照相比于传统 Mesh 模型光照有较大的不同。3DGS 的光照效果是直接写入到 RGB 颜色中的,即光照部分固化到了渲染颜色分量中。因此,如果 3DGS 模型是在大太阳晴天采集、带有非常强烈的硬阴影,重打光也无法消除这些已经固化的阴影。

另外,渲染时颜色取值范围为 [0, 1]。如果不做处理直接增强光照,会出现过曝现象。为防止过曝,通常会将 3DGS 场景先压暗一点再重打光。

在 SDK 中可通过 LCCManager.SetLightIntensity(float _intensity) 方法调整光照强度:

  • 输入参数 _intensity 取值范围为 [0, 1]。
  • 该函数影响整体光照效果:设置的光照强度越强,3DGS 场景会被压得越暗。
  • 默认值为 0.5。

提示:

光照计算是相对消耗性能的操作。SDK 最大支持 50 个动态光源(点光源和聚光灯光源合计)。超出上限时 SetLights 会返回 -1 且不生效。

关键步骤

为 3DGS 场景添加实时光照的关键步骤:

  1. 完成 SetPlatformType / SwitchRenderPass / SetMainCamera 等前置配置,并通过 GetRender + Load 加载 LCC 场景。
  2. 在场景加载完成后(onComplete 回调中)构建 PointLightData 列表并调用 SetLights 下发光源。
  3. 需要动画时,在 Update 中更新光源参数并重新调用 SetLights。
  4. 如出现过曝,通过 SetLightIntensity 先将场景压暗再重打光。
  5. 关闭实时光照时,向 SetLights 传入 null 或空列表。

实时光照相关 API

LCC Unity SDK 通过 LCCManager 提供了以下两个实时光照相关 API。它们都需要在 LCC 场景加载完成后调用(即在 onComplete 回调中)。

SetLights

// 返回值:int → 0=成功, -1=超出最大数量限制
public int SetLights(List<PointLightData> lights)

设置自定义点光源列表。传入 null 或空列表可关闭自定义光照。

参数类型说明
lightsList<PointLightData>光源列表(点光源与聚光灯合计最多 50 个)

调用示例:

using Unity.Mathematics; // float3

var lights = new List<PointLightData>();
lights.Add(new PointLightData {
    position = new float3(0, 5, 0),
    lightType = 0,              // 0=点光源, 1=聚光灯
    color = new float3(1, 1, 1),
    intensity = 2f,
    range = 10f
});
m_manager.SetLights(lights);

说明:

  • 字段类型为 Unity.Mathematics.float3,非 Vector4;color 无 alpha 分量。
  • lightType:0 = 点光源(忽略 direction / spotAngle),1 = 聚光灯(需设置 direction / spotAngle)。
  • 最大数量为 50(点光源与聚光灯合计),超出返回 -1。
  • 传入 null 或空列表关闭自定义光照。
  • 开启后会启用 _USERLIGHT shader keyword。
  • 数据结构定名为 PointLightData 原因是 UnityEngine 已定义 LightData ,为避免歧义。

SetLightIntensity

// 返回值:void
public void SetLightIntensity(float intensity)

设置全局光照强度,用于在重打光前压暗 3DGS 场景、防止过曝。

参数类型说明
intensityfloat光照强度,取值范围 [0, 1]

调用示例:

m_manager.SetLightIntensity(0.5f);

说明:

  • 默认值为 0.5。
  • 取值范围 [0, 1],超出范围会自动钳制。
  • 值越大,3DGS 场景整体被压得越暗。

PointLightData 数据结构

public struct PointLightData {
    public float3 position;    // 世界坐标
    public int lightType;      // 0=点光源, 1=聚光灯
    public float3 color;       // rgb 颜色(无 alpha 分量)
    public float intensity;    // 光照强度
    public float3 direction;   // 聚光灯朝向(点光源忽略)
    public float range;        // 光照范围
    public float spotAngle;    // 聚光灯锥角(度,点光源忽略)
    public float3 pad;         // 对齐填充,无需赋值
}
字段类型说明
positionfloat3光源世界坐标
lightTypeint0 = 点光源,1 = 聚光灯
colorfloat3RGB 颜色(无 alpha 分量)
intensityfloat光照强度
directionfloat3聚光灯朝向,点光源忽略
rangefloat光照范围
spotAnglefloat聚光灯锥角(度),点光源忽略
padfloat3对齐填充,无需赋值