Unity光照笔记
问题
在做项目中遇到了播放中切换场景后地面阴影是纯黑的问题,不得不研究一下光照。先放出官方文档。
Lighting 窗口 - Unity 手册
播放中切换场景后地面阴影是纯黑
只有投到地面的阴影是纯黑的。且跳转到使用相同Terrain的场景没有问题。
相关文章:
关于Unity在游戏运行过程中切换场景导致场景变暗的问题_unity切换场景后变暗-CSDN博客
Unity 切换场景变黑的问题_unity场景变黑了怎么变成原来的样子-CSDN博客
生成光照,可以解决。
这个操作生成了这几个文件:
对LightingData的官方介绍:
光照数据资源 - Unity 手册
没怎么看懂,大概是一个减小实时渲染开销的文件。我以为会把物体的影子刷到地面上,其实没有。
后来我发现设置static的物体在播放中是禁止改transform的,应该也就是在播放中才把背阴面、阴影这些刷到场景里,没播放时还是实时光照。
地形里树的阴影在相机离近时消失
这好像是官方文档里说的“光渗”:
阴影故障排除 - Unity 手册
按里面的说法给树的Mesh Renderer的阴影选Two sided,没用。
生成光照特别慢
直接问了deepseek:
在unity的lighting settings里哪些参数可以显著加快生成光照的速度?
在 Unity 的 **Lighting Settings** 中,优化光照烘焙(Lightmapping)速度的关键参数主要集中在 **烘焙质量** 和 **计算复杂度** 的平衡上。以下是能显著加快生成光照的核心参数及其优化策略:
---
### **一、全局参数优化**
| **参数** | **推荐调整** | **效果说明** |
|---------------------------|-----------------------------------------------------------------------------|-----------------------------------------------------------------------------|
| **Lightmapper** | 选择 **Progressive GPU**(需支持显卡)或 **Progressive CPU**(保守模式) | GPU 加速比 CPU 快 2-5 倍,但需 NVIDIA RTX 或 AMD RDNA2 以上显卡支持。 |
| **Lightmap Resolution** | 降低全局分辨率(默认 40 → 可试 **20-30**) | **最直接影响速度**,分辨率减半可减少 4 倍计算时间,但会降低光照细节。 |
| **Lightmap Padding** | 从默认 2 → 改为 **4-8**(根据模型间距调整) | 减少 Lightmap 贴图数量,但过度增大可能导致光照重叠。 |
| **Compression** | 勾选 **Compress Lightmaps** | 减少 Lightmap 内存占用,间接优化烘焙效率(但可能引入轻微噪点)。 |
---
### **二、间接光照优化**
| **参数** | **推荐调整** |
|---------------------------------|-----------------------------------------------------------------------------|
| **Indirect Resolution** | 设置为 **Lightmap Resolution 的 0.25-0.5 倍**(如 Lightmap=40 → Indirect=10-20) |
| **Bounces** | 减少间接光反弹次数(默认 2 → **1**,复杂场景可试 0) |
| **Filtering (Direct/Indirect)** | 开启 **Auto** 或 **Advanced > Filter Radius 降低至 1-2** |
---
### **三、环境光遮蔽 (AO) 优化**
| **参数** | **推荐调整** |
|-------------------------|---------------------------------------------|
| **Ambient Occlusion** | 关闭或降低 **Max Distance**(默认 1 → **0.5**) |
| **AO Quality** | 降低采样数(默认 High → **Medium/Low**) |
---
### **四、模型与 UV 优化**
1. **标记静态物体**
- 仅对必要物体勾选 **Contribute GI**,减少烘焙对象数量。
2. **简化 UV 展开**
- 确保模型有合理展开的 **UV2**(避免重叠或拉伸,使用 **Auto UV** 或手动优化)。
3. **Texel Density**
- 统一场景模型的 **光照贴图像素密度**(如 20 texels/unit),避免部分物体分辨率过高。
---
### **五、场景分块烘焙**
- 使用 **Lighting Proxy** 或手动分块烘焙(仅烘焙修改区域)。
- 通过 **Lighting > Generate Lighting** 的 **Partial Bake** 模式局部更新。
---
### **六、进阶技巧**
- **降噪加速**:启用 **Denoising**(Progressive Lightmapper)可减少采样数(**Direct/Indirect Samples** 降低 50%)。
- **剔除小物体**:对小于 1 米或远距离物体关闭 **Cast Shadows** 和 **Contribute GI**。
- **材质简化**:避免使用高反射(Metallic > 0.8)或自发光(Emission)材质,它们会增加光线反弹计算。
---
### **优化前后对比示例**
| **场景复杂度** | **默认参数烘焙时间** | **优化后烘焙时间** | **质量损失** |
|------------------|---------------------|--------------------|--------------------|
| 小型室内场景 | 15 分钟 | 2-3 分钟 | 细节模糊(可接受) |
| 中型开放场景 | 2 小时 | 20-30 分钟 | 间接光轻微噪点 |
---
### **注意事项**
- **测试迭代**:建议从最低质量(**Lightmap Resolution=10**)开始测试,逐步提高至可接受质量。
- **混合光照**:对动态物体使用 **Mixed Lighting**(Baked Indirect + Realtime Direct),减少实时计算负担。
- **版本差异**:Unity 2021+ 的 **Progressive Lightmapper** 比旧版 **Enlighten** 更快更稳定。
通过以上参数调整,可显著减少光照烘焙时间,尤其适合快速迭代开发或低端硬件环境。牺牲部分细节质量换取效率提升,根据项目需求灵活平衡!
物体背阴面贴图有花斑
然后用了一组很低的参数,生成的光照贴图在房子背阴面是这样的:
同时在物体的Mesh renderer下有这个警告,说的应该就是这个问题。
又看了另一个有花斑的模型,没有这个警告,好像又不是因为Overlapping UV。
发现在模型导入设置里勾选Generate Lightmap UVs可以解决。
几个实验
主光源baked后生成光照的效果
场景没有阴影,人物没有被照亮。
可能也和光照设置有关。设置是这样的:
主光源Mixed,勾选Baked GI,Shadowmask
看起来和默认的实时光照一样。
光照相关资产文件
Lighting Settings
后缀为.lighting。是填在光照窗口Scene页签的文件。如果不填下面的设置都被禁用,因为使用了默认设置。
Lighting Data Asset
后缀为.asset。是生成光照费半天劲生成的文件之一。
Reflection Probe-0
后缀为.exr。是生成光照生成的文件之一。
光照贴图
分为较亮的dir结尾的、比较暗的light结尾的。它们是成对出现的,同一对是应用于同一些表面的。看检查器里的Texture Type可知第一种叫Directional Lightmap,第二种叫Lightmap。
一些理解
关于光照有很多参数:static(包括物体static和光源static)、光照的模式(实时、烘焙、混合)及其他设置、物体Mesh Renderer的设置、光照设置资产。
首先,只有对static物体,生成光照才有意义。
间接光照:物体背阴面、物体被其他物体遮挡的区域都收不到直接光照,靠间接光照照亮。物体阴面或阴影区全黑就是没有间接光照。
生成光照中一些模型黑色的部分是正在计算的部分。过一会会显示正常。
对Lightmap padding的理解:是生成的光照贴图里这些形状之间填充的纹素个数。
降低Draw Call
遮挡剔除
在测试中遇到了1400次draw call的情况。把运行暂停,把场景里的对象分组失活,发现:
失活城镇3:1402>1119。失活城镇1:1397>953。此处城镇1是相机视野内的但是离得很远已经被地形完全挡住的城镇,但是造成了400多次Draw Call。
直接问deepseek:
在 Unity 中,要让被地形遮挡的物体不调用 Draw Call,需要通过 **遮挡剔除(Occlusion Culling)** 技术实现。以下是完整的实现步骤和优化方法:
---
### **一、核心原理**
- **遮挡剔除(Occlusion Culling)**:通过预计算或运行时检测,跳过对相机视野中**被其他物体完全遮挡的物体**的渲染,从而减少 Draw Call 和 GPU 负载。
- **地形作为遮挡体**:将地形标记为遮挡物(Occluder),其他物体标记为被遮挡物(Occludee),Unity 会自动处理遮挡关系。
---
### **二、实现步骤**
#### 1. **启用遮挡剔除**
- 打开 **Window > Rendering > Occlusion Culling**。
- 在 **Bake** 选项卡中,确保 **Occlusion Culling** 功能已启用。
#### 2. **标记静态物体**
- 选中地形和需要参与遮挡的静态物体(如岩石、建筑等),在 Inspector 右上角勾选:
- **Occluder Static**:地形等遮挡其他物体的对象。
- **Occludee Static**:可能被遮挡的物体(如草丛、箱子)。
- 
#### 3. **烘焙遮挡数据**
- 在 **Occlusion Culling** 窗口的 **Bake** 选项卡中调整参数:
- **Smallest Occluder**:设置地形细节级别(例如 `10`,单位:米,值越小精度越高)。
- **Smallest Hole**:遮挡孔洞的最小尺寸(通常保持默认 `0.25`)。
- 点击 **Bake** 生成遮挡数据,完成后会在场景中生成 **Occlusion Culling Data** 文件。
#### 4. **验证效果**
- 在 Scene 视图顶部下拉菜单中选择 **Occlusion Culling** > **Visualization**。
- 移动相机,被地形遮挡的物体会显示为**红色(未渲染)**,可见物体为**绿色(已渲染)**。
---
### **三、动态物体的处理**
若需要被遮挡的物体是动态的(如移动的敌人),需结合以下方法:
#### 1. **脚本检测遮挡**
```csharp
using UnityEngine;
public class DynamicOcclusion : MonoBehaviour {
private Renderer rend;
void Start() {
rend = GetComponent<Renderer>();
}
void Update() {
// 检测物体是否被地形遮挡
if (Camera.main != null) {
Vector3 viewportPos = Camera.main.WorldToViewportPoint(transform.position);
bool isVisible = GeometryUtility.TestPlanesAABB(
GeometryUtility.CalculateFrustumPlanes(Camera.main),
rend.bounds
);
rend.enabled = isVisible; // 根据可见性开关渲染器
}
}
}
```
- 将此脚本附加到动态物体上,根据可见性动态启用/禁用渲染。
#### 2. **LOD(细节层次)配合**
- 对中远距离物体使用低模(LOD1/LOD2),减少被遮挡时的计算开销。
---
### **四、注意事项**
1. **遮挡烘焙参数优化**
- **Smallest Occluder** 值过大可能导致小物体无法遮挡其他物体,建议根据场景比例调整。
- 复杂场景可分层烘焙:先烘焙地形,再烘焙建筑等大型物体。
2. **性能权衡**
- 遮挡剔除的预计算需要时间,适合静态场景。
- 动态遮挡(如上述脚本)会增加 CPU 开销,需测试平衡。
3. **地形设置**
- 确保地形的碰撞体(Collider)完整,否则可能无法正确遮挡。
---
### **五、常见问题**
#### Q1:烘焙后遮挡无效?
- 检查物体是否标记为 **Occludee Static**。
- 调整 **Smallest Occluder** 值,确保小于遮挡物的尺寸。
#### Q2:如何减少遮挡数据体积?
- 增大 **Smallest Occluder** 和 **Smallest Hole** 的值。
- 移除不必要的静态物体标记。
---
### **六、替代方案**
- **视锥体剔除(Frustum Culling)**:Unity 默认启用,仅渲染相机视锥体内的物体。
- **硬件遮挡查询(Hardware Occlusion Query)**:适合高端设备,但需手动实现。
通过合理配置遮挡剔除,可显著减少地形遮挡区域的 Draw Call,尤其适用于开放世界或复杂室内场景! 🌟
照做之后在遮挡剔除Visualization看效果。远方有一些房子被剔除了,还有一些应该剔除的没剔除。这时候再运行,看向远方的小镇,batches最多只有700多次了,失活远方小镇batches还会降到500多次。然后就研究调整参数把这几个房子也剔除了。
URP项目动态合批设置的位置
Unity性能优化篇(三) SRP/URP动态合批开启与注意事项_unity 开启动态合批-CSDN博客
偏好>Core Render Pipeline>All Visible>项目设置>Graphics>Scriptable Render Pipeline Settings>Rendering
相关文章:

Unity光照笔记
问题 在做项目中遇到了播放中切换场景后地面阴影是纯黑的问题,不得不研究一下光照。先放出官方文档。 Lighting 窗口 - Unity 手册 播放中切换场景后地面阴影是纯黑 只有投到地面的阴影是纯黑的。且跳转到使用相同Terrain的场景没有问题。 相关文章:…...
Linux中安装samba服务
在Linux服务器上安装Samba可以实现文件共享功能,下面为你详细介绍安装步骤: 一、安装Samba 不同的Linux发行版使用不同的命令来安装Samba: Debian/Ubuntu: sudo apt update sudo apt install sambaCentOS/RHEL: s…...
猫咪如厕检测与分类识别系统系列~进阶【三】网页端算法启动架构及数据库实现
前情提要 家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的如…...
Elasticsearch性能调优全攻略:从日志分析到集群优化
#作者:猎人 文章目录 前言搜索慢查询日志索引慢写入日志性能调优之基本优化建议性能调优之索引写入性能优化提升es集群写入性能方法:性能调优之集群读性能优化性能调优之搜索性能优化性能调优之GC优化性能调优之路由优化性能调优之分片优化 前言 es里面…...

嵌入式学习的第二十天-数据结构-调试+链表的一般操作
一、调试 1.一般调试 2.找段错误 二、链表的一般操作 1.单链表的修改 int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data) {DATATYPE * tmp FindLinkList(ll, name);if(NULL tmp){return 1;}memcpy(tmp,data,sizeof(DATATYPE));return 0; } 2.单链表的销毁 int D…...
Leetcode 3548. Equal Sum Grid Partition II
Leetcode 3548. Equal Sum Grid Partition II 1. 解题思路2. 代码实现 题目链接:3548. Equal Sum Grid Partition II 1. 解题思路 这一题是题目3546. Equal Sum Grid Partition I的进阶版本,不过本质上还是差不多的。 相较于题目3546,这里…...

家具制造行业的现状 质检LIMS如何赋能家具制造企业质检升级
在家具制造行业,从原木切割到成品出厂,质检环节贯穿始终 —— 木材含水率是否达标、板材甲醛释放量是否合规、涂层耐磨性能否通过标准…… 这些看似琐碎的检测项目,实则是企业把控产品品质、规避市场风险的核心关卡。传统人工质检模式在效率、…...

idea整合maven环境配置
idea整合maven 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每个知识点,都是写出代码…...

无偿帮写毕业论文(看不懂的可以私信博主)
以下教程教你如何利用相关网站和AI免费帮你写一个毕业论文。毕竟毕业论文只要过就行,脱产学习这么多年,终于熬出头了,完成毕设后有空就去多看看亲人好友,祝好! 一、找一个论文模板 废话不多说,先上干货Ov…...

小白成长之路-vim编辑
文章目录 Vim一、命令模式二、插入模式3.a:进入插入模式,在当前光标的后一个字符插入4.o: 在当前光标的下一行插入5.i:在当前光标所在字符插入,返回命令模…...
Java 开源报表系统全解析:免费工具、企业案例与集成实践
在企业级数据可视化与报表开发中,选择一款功能强大且完全免费的开源报表系统至关重要。本文深度剖析 5 款经过权威验证的免费开源 Java 报表工具,涵盖图表展示、定制化及第三方集成能力,附企业级案例与技术实践,助您高效选型。 一…...

【常用算法:排序篇】7.算法魔法与面试秘籍:从趣味排序到实战通关
一、趣味排序算法:突破常规的思维火花 1. 睡眠排序(Sleep Sort)—— 时间维度的魔法 核心思想:利用多线程休眠时间模拟数值大小,自然输出有序结果。Python示例:import threading import timedef sleep_so…...
前端npm的核心作用与使用详解
一、npm是什么? npm(Node Package Manager) 是 Node.js 的默认包管理工具,也是全球最大的开源代码库生态系统。虽然它最初是为 Node.js 后端服务设计的,但如今在前端开发中已成为不可或缺的基础设施。通过npm,开发者可以轻松安装、管理和共享代码模块。 特性: 依赖管理…...

Android | IOS — Solox性能测试
文章目录 Solox性能测试1. 前置条件2. 软件图片 Solox性能测试 1. 前置条件 安装Python:3.10.0以上版本: Windows:Python官网 安装 SoloX python -m solox2. 软件图片 软件图片 报告分析:...
Rust 数据结构:Vector
Rust 数据结构:Vector Rust 数据结构:Vector创建数组更新数组插入元素删除元素 获取数组中的元素迭代数组中的值使用枚举存储多个类型删除一个数组会删除它的元素 Rust 数据结构:Vector vector 来自标准库,在内存中连续存储相同类…...
探索Turn.js:打造惊艳的3D翻页效果
目录 简介与特性 环境准备与安装 基础用法与初始化 配置参数详解 事件监听与交互 动态加载与页面管理 兼容性与性能优化 常见问题与解决方案 完整示例代码 1. 简介与特性 Turn.js 是一个基于 jQuery 的 JavaScript 库,专注于实现类书籍翻页的 3D 动画效果…...

Midjourney 最佳创作思路与实战技巧深度解析【附提示词与学习资料包下载】
引言 在人工智能图像生成领域,Midjourney 凭借其强大的艺术表现力和灵活的创作模式,已成为设计师、艺术家和创意工作者的核心工具。作为 CSDN 博主 “小正太浩二”,我将结合多年实战经验,系统分享 Midjourney 的创作方法论&#x…...
OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南
🚀📊 OPC UA ABP vNext 企业级实战:高可用数据采集框架指南 🚀 📑 目录 🚀📊 OPC UA ABP vNext 企业级实战:高可用数据采集框架指南 🚀一、前言 🎯二、系统…...
MySQL库级管理:数据库管理与存储引擎剖析
引言 各位数据库爱好者们好!今天我们要深入探讨MySQL数据库的基本操作,这是每位开发者必须掌握的"内功心法" 💪。无论你是刚接触MySQL的小白,还是需要复习基础的老手,这篇教程都将带你系统学习数据库的核心…...
LeetCode 2094.找出 3 位偶数:遍历3位偶数
【LetMeFly】2094.找出 3 位偶数:遍历3位偶数 力扣题目链接:https://leetcode.cn/problems/finding-3-digit-even-numbers/ 给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。 你…...
机器学习-计量经济学
机器学习 不要事前决定变量关系,关键是谁也不知道啊,机器学习学习的模型(那也不是真实的关系啊) 这就是自然学科的好处:只要不断的优化这个未知的东西(函数),然后在数据上ÿ…...

工具篇-扣子空间MCP,一键做游戏,一键成曲
一、登陆扣子空间 地址如下: 扣子空间 打开,然后登陆扣子 登陆之后快速开始: 二、生成游戏 小试牛刀,我们让它做一个打地鼠的游戏: 已经开始设计制作: 制作完成: 三、制作音乐 新…...

5.6 - 5.9 MySQL
数据库:存储和管理数据的仓库DB。 数据库管理系统:操纵和管理数据库的大型软件DBMS。 关系型数据库 一个数据库内可以创建多张表,在一个表内能存放多个数据。 SQL语句: DDL: 存储字符串用varchar。(类似于…...

C# WinForm 如何高效地将大量数据从 CSV 文件导入 DataGridView
如果你有非常多的csv文件,每个文件包含N多行与M多列,如:18000 行和 27 列。现在,想制作一个 Windows 窗体应用程序,导入它们并在 datagridview 中显示,然后进行一些数学运算。可是,发现数据导入…...
【redis】redis常见数据结构及其底层,redis单线程读写效率高于多线程的理解,
redis常用数据结构及底层 string字符串、list链表、set无序集合、zset有序集合、hash哈希 1.string 底层结构是SDS简单动态字符串 struct sdshdr {int len; // 已用长度(字符串实际长度)int free; // 剩余可用空间char buf[]; // 数组&#…...
2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式
2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式 一、本周热点回顾1. OpenAI发布GPT-5多模态大模型 突破通用智能关键阈值2. 特斯拉Optimus机器人量产版发布 具身智能进入工业场景3. 百度文心ERNIE…...

SQLPub:一个提供AI助手的免费MySQL数据库服务
给大家介绍一个免费的 MySQL 在线数据库环境:SQLPub。它提供了最新版本的 MySQL 服务器测试服务,可以方便开发者和测试人员验证数据库功能,也可以用于学习 MySQL。 免费申请 在浏览器中输入以下网址: https://sqlpub.com/ SQLP…...

URP相机如何将场景渲染定帧模糊绘制
1)URP相机如何将场景渲染定帧模糊绘制 2)为什么Virtual Machine会随着游戏时间变大 3)出海项目,打包时需要勾选ARMv7吗 4)Unity是手动还是自动调用GC.Collect 这是第431篇UWA技术知识分享的推送,精选了UWA社…...

WeakAuras Lua Script ICC (BarneyICC)
WeakAuras Lua Script ICC (BarneyICC) https://wago.io/BarneyICC/69 全量英文字符串: !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…...
为什么 mac os .bashrc 没有自动加载?
原因说明 在macOS中,默认情况下,终端使用的是Bash或Zsh作为shell。对于较新版本的macOS(从Catalina开始),默认的shell已经切换为Zsh。因此,如果你正在使用Zsh,.bashrc文件不会自动生效…...