Unity光照笔记

news2025/5/16 20:37:42

问题

在做项目中遇到了播放中切换场景后地面阴影是纯黑的问题,不得不研究一下光照。先放出官方文档。

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**:可能被遮挡的物体(如草丛、箱子)。
     - ![Static Flags](https://docs.unity3d.com/uploads/Main/OcclusionCullingStaticFlags.png)

#### 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式学习的第二十天-数据结构-调试+链表的一般操作

一、调试 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…

家具制造行业的现状 质检LIMS如何赋能家具制造企业质检升级

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

idea整合maven环境配置

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

无偿帮写毕业论文(看不懂的可以私信博主)

以下教程教你如何利用相关网站和AI免费帮你写一个毕业论文。毕竟毕业论文只要过就行&#xff0c;脱产学习这么多年&#xff0c;终于熬出头了&#xff0c;完成毕设后有空就去多看看亲人好友&#xff0c;祝好&#xff01; 一、找一个论文模板 废话不多说&#xff0c;先上干货Ov…

小白成长之路-vim编辑

文章目录 Vim一、命令模式二、插入模式3.a:进入插入模式&#xff0c;在当前光标的后一个字符插入![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fd293c3832ed49e2974abfbb63eeb5bb.png)4.o: 在当前光标的下一行插入5.i:在当前光标所在字符插入&#xff0c;返回命令模…

【常用算法:排序篇】7.算法魔法与面试秘籍:从趣味排序到实战通关

一、趣味排序算法&#xff1a;突破常规的思维火花 1. 睡眠排序&#xff08;Sleep Sort&#xff09;—— 时间维度的魔法 核心思想&#xff1a;利用多线程休眠时间模拟数值大小&#xff0c;自然输出有序结果。Python示例&#xff1a;import threading import timedef sleep_so…

Android | IOS — Solox性能测试

文章目录 Solox性能测试1. 前置条件2. 软件图片 Solox性能测试 1. 前置条件 安装Python:3.10.0以上版本&#xff1a; Windows&#xff1a;Python官网 安装 SoloX python -m solox2. 软件图片 软件图片 报告分析&#xff1a;

Midjourney 最佳创作思路与实战技巧深度解析【附提示词与学习资料包下载】

引言 在人工智能图像生成领域&#xff0c;Midjourney 凭借其强大的艺术表现力和灵活的创作模式&#xff0c;已成为设计师、艺术家和创意工作者的核心工具。作为 CSDN 博主 “小正太浩二”&#xff0c;我将结合多年实战经验&#xff0c;系统分享 Midjourney 的创作方法论&#x…

工具篇-扣子空间MCP,一键做游戏,一键成曲

一、登陆扣子空间 地址如下&#xff1a; 扣子空间 打开&#xff0c;然后登陆扣子 登陆之后快速开始&#xff1a; 二、生成游戏 小试牛刀&#xff0c;我们让它做一个打地鼠的游戏&#xff1a; 已经开始设计制作&#xff1a; 制作完成&#xff1a; 三、制作音乐 新…

5.6 - 5.9 MySQL

数据库&#xff1a;存储和管理数据的仓库DB。 数据库管理系统&#xff1a;操纵和管理数据库的大型软件DBMS。 关系型数据库 一个数据库内可以创建多张表&#xff0c;在一个表内能存放多个数据。 SQL语句&#xff1a; DDL&#xff1a; 存储字符串用varchar。&#xff08;类似于…

C# WinForm 如何高效地将大量数据从 CSV 文件导入 DataGridView

如果你有非常多的csv文件&#xff0c;每个文件包含N多行与M多列&#xff0c;如&#xff1a;18000 行和 27 列。现在&#xff0c;想制作一个 Windows 窗体应用程序&#xff0c;导入它们并在 datagridview 中显示&#xff0c;然后进行一些数学运算。可是&#xff0c;发现数据导入…

SQLPub:一个提供AI助手的免费MySQL数据库服务

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

URP相机如何将场景渲染定帧模糊绘制

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

WeakAuras Lua Script ICC (BarneyICC)

WeakAuras Lua Script ICC &#xff08;BarneyICC&#xff09; https://wago.io/BarneyICC/69 全量英文字符串&#xff1a; !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…

FramePack - 开源 AI 视频生成工具

&#x1f3ac; 项目简介 由开发者 lllyasviel 创建的一个轻量级动画帧处理工具库&#xff0c;专门用于游戏开发、动画制作和视频处理中的帧序列打包与管理。该项目采用高效的算法实现&#xff0c;能够显著提升动画资源的处理效率。 此 AI 视频生成项目&#xff0c;旨在通过低显…

Vuetify框架使用(一)之v-snackbar 组件封装及全局使用

说明&#xff1a;v-snackbar 组件适用于统一管理消息提示框(操作反馈的提示) 看效果&#xff1a; 1、在状态管理中创建文件&#xff0c;统一管理 // stores/snackbar.js /*** 统一管理消息提示框(操作反馈的提示)*/import { defineStore } from pinia; // 消息类型 export co…

FPGA: UltraScale+ bitslip实现(方案+代码)

收获 一晃五年~ 五年前那个夏夜&#xff0c;我对着泛蓝的屏幕敲下《给十年后的自己》&#xff0c;在2020年的疫情迷雾中编织着对未来的想象。此刻回望&#xff0c;第四届集创赛的参赛编号仍清晰如昨&#xff0c;而那个在家熬夜焊电路板的"不眠者"&#xff0c;现在…

【SpeechLMs】语音大型语言模型综述《A Survey on Speech Large Language Models》

摘要 大型语言模型 (LLM) 表现出强大的上下文理解能力和显著的多任务性能。 因此&#xff0c;研究人员一直在寻求将 LLM 整合到更广泛的语音语言理解 (SLU) 领域。 与传统方法不同&#xff0c;传统方法是将 LLM 级联以处理自动语音识别 (ASR) 生成的文本&#xff0c;而新方法则…

吴恩达机器学习笔记:特征与多项式回归

1.特征和多项式回归 如房价预测问题&#xff0c; ℎθ (x) θ0 θ1 frontage θ2 deptℎ x1 frontage&#xff08;临街宽度&#xff09;&#xff0c;x2 deptℎ&#xff08;纵向深度&#xff09;&#xff0c;x frontage ∗ deptℎ area &#xff08;面积&#xff09;…

LangChain4j正式发布-简化将 LLM 集成到 Java 应用程序过程

LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序中的过程。 官网地址 源码地址 开源协议&#xff1a;Apache License 2.0 实现方法 统一 API&#xff1a;LLM 提供程序&#xff08;如 OpenAI 或 Google Vertex AI&#xff09;和嵌入&#xff08;矢量&#xff09;存储…