Unity全局光照详解
之前就学过但是太久没用又忘了,因此用最简洁易懂的语言做个记录。
全局光照分为两个系统,分别是实时光照和混合光照。(点击window/Rendering/Lighing打开此面板)
其中全局光照对于我来说都是新技术了,上一次学习全局光照的时候的时候都还没有这个技术,因为在项目中大部分是用一个直接光照和环境光就完事了。
我不打算先说明各种术语,而是在使用的时候再说明,以免大家没耐心看下去。我之所以要写这个博客就是看别人的博客的时候老是先说很久术语才进入正题,导致我看的很没耐心。
unity中其实有两套全局光照系统,就是上图中的Realtime lighting和mixed lighting,即实时光照和混合光照。他们其实是独立的,我们一般选择性使用其中一种就行了。他们两个也可以同时启用,同时启用的话太混乱而且性能消耗也很高,我就不考虑了。
实时光照:
启用时场景中的光源只能使用实时模式,也就是Realtime,但是系统不会自动切换,注意手动设置,启用Realtime Environment Lighting的话除了直接光还会实时计算间接光并应用效果,不过能计算间接光的只有平行光,因为其他的太耗性能了。

光源有三种模式,剩下的之后再说。实时光照只能选择realtime,不用管。
要注意的是,虽然名字是实时光照,但是还是只能对静态物体进行光照计算。我们在场景中放置好要被实时关照的物体,并设置为contribute GI静态,其他的可选可不选。
搭建好场景,根据需要设置环境光,这个太基础了就不讲了。要注意的是如果想在场景中实现全黑的效果环境光就必须为0。我这里环境光设置为0,以排除影响。初始场景是这样的,所有物体都是静态物体。

开启全局光照和全局光照环境光选项不开启混合光照,平行光光照模式模式设置Realtimeh后,点积烘焙光照。这个烘焙光照其实是计算光信息,然后存储在贴图中,之后就可以实时计算间接光了。

可以看到这个贴图非常的小,这也是能实时计算的原因。烘焙光照后:
实时光照效果一般,参数几乎不可调。但是他强在实时的间光接效果,光源可随意移动,可以让开发者动态调整静态场景中的光源参数,快速制作美术原型,在场景进行美术设计师不用每次等待漫长的烘焙,并且在较低要求下它也可以胜任昼夜交替等效果。
虽然我说它的效果一般,但是实际上它的效果对比默认环境光还是好得多。
对了,间接光。大家可能看不太出来间接光的效果,其实有,但是很弱,仔细看才能看到。
上面只说了静态物体,接下来要说动态物体了。我们放一个胶囊提,不设置为static。
效果如下,它的背面是完全黑的。
因为实时光照计算的间接光是烘焙的,并不是真的光,所以动态物体收不到间接光。此时我们就需要用到光照探针了。
什么是光照探针?在unity中右键,可以创建光照探针LightProbeGroup,或者说探针组。
它长这样,其中的8个点可以拖拽,来包括一个范围,但是我们一般不拖拽,而是复制粘贴多个探针在场景中。
然后重新在lighing面板Generate Lighting后胶囊体的背面受到了光照
所谓LighingProbeGroup就是一组光照探针,其中的每个点是一个探针。它的作用是收集周围的间接光信息并施加到动态物体上,就这么简单。
不过这个要注意的一件事是摆放的位置和密度,密度越高性能消耗越高,位置也有所讲究,我们不能只摆在有光的地方,我们还要摆在没有光的地方。因为动态物体受到的间接光照是来自最近的探针的。假设世界中只有一个探针,那么无论在哪里动态物体都受到一样强度的间接光照。
如图,离得很远背面一样很亮。
要解决这个问题需要在世界放置更多探针,光线不重要的区域探针组可以很分散。如图,背面变得黑暗了。
上面就是实时光照的部分。理解了上面的部分就可以讲混合光照了。
混合光照:
混合光照有三个选项,分别是Baked Indirect,Subtractive,ShadowMask。接下来依次说明。
1.BakeIndirect模式混合光照:

选择baked indirect,下面也有说明,混合光源提供实时直接光,间接光被烘焙到光照贴图和光照探针中。
很清晰,直接烘焙光照,我们先不用管烘焙的各种参数,我们先着重于模式之间的区别,参数后面再说,只用设置这里的烘焙选项改为Gpu就行了,也就是用显卡来烘焙而不是cpu,会快很多。遥想当年用cpu烘焙的龟速,简直要吐了。

如果直接烘焙没有效果,记得把光源改成mixedLight,改成realtime会无法烘焙,改成baked的话可以烘焙,但是光源不会再有直接光。只有使用MixedLight才能在有直接光的同时烘焙间接光照贴图。

烘焙后的效果,也不太好看。因该是我场景设置的问题QWQ
因此我决定换个场景,可以看到换个场景,也就是加了墙面后间接光效果更好,整个场景也更好看了。
为了公平起见,重新用新的场景进行实时渲染来对比。
可以看到实时渲染和Baked Indirect视觉效果差不多。烘焙的渲染要更加深邃柔和一点,但是差的不是很多,这也说明用实时光照进行场景照明也是不错的。
实时光照移动光源时间接光会跟着变化,而烘焙光照(混合光照,物体接受直射光和烘焙后的间接光),移动相机时烘焙的间接光不会变化,也就是相机换了角度但是图中的绿色蓝色红色之类的反射光还在原地,但是阴影是实时的。
对了,还得对比一下不使用全局光照的效果,也就是一个平行光提供直接光照加上天空盒的环境光,确实挺难看的,不过在动态生成的地图中也没啥办法,除非用某些支持实时动态的插件。
引入动态物体
和实时光照一样,放置光照探针重新烘焙就行了。
2.Subtractive模式混合光照:
Subtractive 光照模是一个注重性能的模式,这在低端硬件上非常有用,因为低端硬件需要注重性能,并且只需要一个实时阴影投射光源。这种光照模式不会提供特别逼真的光照效果,而是更适合风格化美学,例如卡通风格。因此在实际使用时会有一些奇怪的效果,下面会讲解。

先看看描述,说的也很清晰,混合光源对静态物体提供烘焙的直接光和间接光,动态物体接受主平行光提供的实时的直接光并且可以投射阴影到静态物体上。

因为直接光烘焙在了静态物体中,所以此时移动光源直接光照不会有任何变化,其实烘焙了直接光也就意味着烘焙了阴影(注意烘焙直接光和提供直接光的区别),在移动光源时场景中烘焙好的物体的直接光照和间接光照和阴影不会有任何变化。
要注意的是,描述说的不是很全,动态物体并不是只能接受主平行光的光照,它也可以接受其他光源的直接光照并产生阴影,只是主平行光会特殊处理。主平行光投射的阴影不仅会投射到静态物体上还会穿过静态物体。
这个图看着很奇怪,动态胶囊体C的阴影怎么是红色的?为什么还能穿过方块F?是光照角度的问题吗?和其他胶囊体对比发现并不是光照角度的问题,胶囊体AB的阴影都是正常的。
其实是因为阴影被烘焙到光照贴图中,所以 Unity 在运行时缺少将烘焙阴影和实时阴影准确地结合在一起所需的信息,也可以理解为没有遮挡信息。但是,Unity 提供了 Realtime Shadow Color 属性来减少光照贴图的影响,从而在烘焙阴影和实时阴影之间创建正确的混合视觉效果。还可以调整颜色来实现某种艺术风格。

要注意的是,只有实时阴影和烘焙阴影重叠的时候才会使用RealTimeShadowColor,如图

Subtractive中还有一个特性,就是静态物体无法使用高光效果,因为高光效果需要依赖实时光照的计算,静态物体的光照数据是烘焙的,无法得到实时光照数据。
还有要注意的是,因为静态物体的光照和阴影都是烘焙的并不是实时的,而且主平行光是分开计算的,所以动态物体不会接受静态物体所产生的光照。
要对动态物体实施间接光照和之前一样,烘焙光照探针即可。

如图,动态胶囊体在阴影中依然直接受到直接光照,要让他能模拟受到阴影的效果,就必须烘焙光照探针。为什么要说模拟受到阴影呢?因为它实际上还是没有受到阴影,只是周围的光照探针信息较暗让他比整体变暗了而已。

如果读者自己尝试就会发现探针的位置其实很有讲究,因为现在所受到间接光其实是周围探针共同作用的。

点击动态物体可以看到对其有影响的探针,最左下角的探针是黑的,左上方较暗,而右方的较亮。动态物体收到的光照是根据探针的光照信息来混合得到的,如果把左方的两个探针移动到更亮的地方那么动态物体左侧会更亮,反之会更暗。
3.Shadowmask模式混合光照:
Shadowmask的作用是什么呢?在开发开放世界游戏中,如果地图很大,为了更好的视觉效果,最好能够计算所有的阴影,但是我们的性能不允许我们这么做,我们不可能计算所有物体的阴影,除非全是静态阴影。假设我们使用Subtractive模式,静态物体的实时阴影没有问题,但是动态物体却接收不到静态物体的阴影。如果我们想动态物体和静态物体的关系能够正确,并且可以有静态阴影,那么就要用到shadowmask模式。而相比Baked indirect,在近处使用实时阴影时远处也可以有静态阴影。

混合光源提供实时直接光照,间接光被烘焙到光照贴图和光照探针中。为了烘焙阴影会生成阴影遮罩和探针遮挡关系,使用的阴影遮罩模式可以在编辑器的Qualtiy设置中设置。
阴影遮罩模式有两种,分别是DistanceShadowmask和shadowmask。他们之间的主要区别是是否使用阴影距离,阴影距离也在下图中设置,shadowDistance就是。

3.1DistanceShadowmask
再次查看描述,混合光提供直接光,间接光被烘焙。这两个简单,关键在于烘焙阴影,生成了Shadowmask和Light probe occulsion,这里的shadowmask其实就可以看成生成好的烘焙阴影贴图,而light probe occulsion就是光照探针遮挡关系,他是光照探针系统的一部分,也就是记录阴影的遮挡关系。有了它我们就可以完成subtractive模式中无法做到的使用间接光来计算阴影。
描述里没有明确说明,但其实提供直接光照也包括投射阴影,所以,shadowmask中模式中同时存在静态阴影和动态阴影。其中shadowmask就是烘焙的阴影。
实际上这个模式笼统来说就是远处用烘焙的阴影,近处用实时阴影,更简单的情况下用探针计算阴影。就这些。这个模式适合全静态场景但是需要正确光照效果的场景,或者说大地图场景但是静态光源。
为什么要静态光源呢?因为这个本质还是烘焙的,如果光源变化但是远处的阴影不变和间接光不变看着就不合理。
具体的光照处理如下图,其中的阴影贴图可以理解为实时光照用到的贴图,表中如果说用的是阴影贴图就代表用的是实时阴影。

3.2Shadowmask

shadowmask模式其实本质上和Distance shadowmask差不多,只不过更省性能罢了。
shadowmmask模式中阴影存储在贴图中,所以阴影距离相比Baked Indirect可以设置的更小,可以更节省性能。
光源说明
上面所有的案例说的都是平行光,其他光源也差不多,只不过实时光照模式中只有平行光可以实时光照。Subtractive中主平行光阴影比较特殊。
然后光源中还有一个模式:Baked模式,这个只能在混合光照模式中使用。

它和Mixed的区别是它不会对动态物体产生光照。
然和说一个特殊的光源:面光

他没有模式设置,在混合光照模式下使用,直接烘焙就可以,他产生的光是从面上向四面八方反射,所以最终结果更加真实柔和但是烘焙时间更长

相关文章:
Unity全局光照详解
之前就学过但是太久没用又忘了,因此用最简洁易懂的语言做个记录。 全局光照分为两个系统,分别是实时光照和混合光照。(点击window/Rendering/Lighing打开此面板) 其中全局光照对于我来说都是新技术了,上一次学…...
计算机网络知识点全梳理(三.TCP知识点总结)
目录 TCP基本概念 为什么需要TCP 什么是TCP 什么是TCP链接 如何唯一确定一个 TCP 连接 TCP三次握手 握手流程 为什么是三次握手,而不是两次、四次 为什么客户端和服务端的初始序列号 ISN 不同 既然 IP 层会分片,为什么 TCP 层还需要 MSS TCP四…...
ELK Stack 安装、配置以及集成到 Java 微服务中的使用
ELK Stack 是由 Elasticsearch、Logstash 和 Kibana 组成的日志管理解决方案。以下是详细的安装、配置步骤以及如何将其集成到 Java 微服务中。 1. 安装 ELK Stack 1.1 安装 Elasticsearch 在 Ubuntu 上安装 Elasticsearch: bash wget -qO - https://artifacts…...
list_
1.对象创建 // // Created by 徐昌真 on 2024/12/12. // #include <iostream> #include <list>using namespace std;void Print(list<int> &my_list) {for ( list<int>::iterator iter my_list.begin(); iter ! my_list.end(); iter ){cout <…...
电机驱动,为什么不需要变速器?
在现代汽车和工业应用中,电机驱动的技术愈发成熟,其核心优势之一是能够省去传统机械变速器的需求。 一、电机驱动的基本原理 电机驱动又被称为电动机驱动,其基本原理是将电能转化为机械能。通过控制电机的输入电压和电流,电机能…...
how to write 述职pptx as a tech manager
As a technical manager, crafting an effective 述职 (performance review) PPT requires you to highlight your leadership, team accomplishments, technical contributions, challenges faced, and future plans. Heres a structured approach to design your PPT: 1. Cov…...
关于QMessageBox的一些使用总结和避坑指南
参考学习 Qt中QMessageBox的用法—看这一篇就够了 Qt:使用QMessageBox弹出标准对话框 QMessageBox模态与非模态及QT中的exec() 如何调整QMessageBox的大小 QSS 自定义QMessageBox python QMessageBox设置标签和按钮居中、中文按钮 使用建议 经过查看多方的资料&…...
C语言预处理详解
1.预定义符号 C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C&#…...
大语言模型画图(流程图、框架图)
第一步:向随意大语言模型,描述内容,推荐豆包 豆包 加上下面Prompt 通过Mermaid语法,描述上面流程图 第二步:将生成Mermaid输入流程图生成网站 中文Mermaid - 流程图、关系图在线画图、生成和编辑器...
2024年API接口发展趋势:智能化、自动化引领潮流
随着信息技术的飞速发展,应用程序编程接口(API)已成为现代软件开发的核心组成部分。API作为不同系统之间的桥梁,使得数据、功能和服务能够在各种平台和设备之间无缝流动。在2024年,API接口正经历着一系列显著的变革和发…...
数据挖掘与机器学习DMML(part 8)K近邻(KNN)
K Nearest Neighbours KNN Definition KNN 是一种简单的算法,它存储所有可用案例,并根据相似度量对新案例进行分类。 KNN 不同名称: K-Nearest Neighbors • Memory-Based Reasoning基于记忆的推理 • Example-Based Reasoning基于实例的…...
Fortify 24.2.0版本最新版 win/mac/linux
工具介绍: Fortify SCA作为一款业内主流的静态代码扫描工具,被广泛应用于白盒测试中。与其他静态代码扫描工具相比,Fortify SCA的突出优势主要在于更加广泛地支持的语言和开发平台、更全面和权威的安全规则库使扫描更加全面、更加智能化的自定…...
突破时间与空间限制的富媒体百宝箱——智能工具箱:让云上内容生产更easy
“这是你的同款日常吗?老是在赶deadline,苦练PS还未出师,premiere、达芬奇真的好难,学python脑容量确实不够~打工人太难了~~” 来试试智能工具箱吧!即来即用,一键实现办公自由。图片工具、视频工具、音频工…...
MacOs使用Wine 安装UaExpert与UaExpert的使用
要在 macOS 上使用 Wine 安装和运行 UaExpert,可以按照以下步骤操作: 安装 Wine 在 macOS 上,你可以通过 Homebrew 来安装 Wine。如果你还没有安装 Homebrew,可以先安装 Homebrew,然后使用它来安装 Wine。 bash /bin…...
【Prompt Engineering】3.文本概括
一、引言 文本信息量大,LLM在文本概括任务上展现出强大能力。本章介绍如何通过编程方式调用API接口实现文本概括功能。 首先,我们需要引入 zhipuAI 包,加载 API 密钥,定义 getCompletion 函数。 from zhipuai import ZhipuAIke…...
力扣-图论-14【算法学习day.64】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
redis 架构详解
Redis架构详解可以从以下几个方面进行阐述: 一、部署架构 Redis有多种部署架构,适用于不同的应用场景和需求,主要包括以下几种: 单机模式(Standalone Mode) 特点:部署简单,配置方便…...
多分类交叉熵与稀疏分类交叉熵
总结: 标签为 One-hot 编码的多分类问题,用分类交叉熵对于标签为整数的多分类问题,用稀疏分类交叉熵稀疏分类交叉熵内部会将整数标签转换为 One-hot 编码,而如果标签已经是 One-hot 编码的形式,再使用稀疏分类交叉熵就会多此一举。 算例 假设我们有三个类别:A、B 和 C。…...
PHP 8新特性深度解析与实战应用
引言 PHP作为一种广泛使用的开源脚本语言,以其在Web开发领域的卓越性能而闻名。随着PHP 8的发布,这门语言再次迎来了许多令人兴奋的新特性和改进。本文将深入探讨PHP 8的新特性,并提供实战应用示例,帮助开发者更好地理解和使用PH…...
【C语言】UDP通信
udp使用的是数据报传输。可以一对一,一对多进行传输,用于快速,实时性高的场景 服务器端: 使用步骤: 1.创建socket 2.bind绑定可接收的客户端 3.while{ recv接收数据 send发送数据 } #include <stdio.h> #inclu…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
