GI_comparison_1.png
可见,直射光无法到达的暗部必须通过间接照明来照亮,而不是添加实时光来增加暗部的亮度。
事实上,如果场景中有很多灯光——,例如,如果给上图中的房间添加很多补光灯来增加室内亮度——
它还会导致场景中的明暗对比度降低,使画面显得“更扁平”。
这也是很多朋友项目场景中普遍存在的问题,即亮度不够进行光补偿。修改了一下,发现整个场景充满了太多的灯光,所以场景很亮。明暗没有对比,导致视觉效果不真实。
我相信你一定已经想到了。这个想法的另一种实践是在亮度不够的时候用灯来补光。 —— 当场景中的角色不够亮时,您还可以选择使用灯光对角色进行补光。 ——也有前面提到的同样的问题。
那么怎样才能更合理地凸显人物性格呢? (虽然照亮角色本身并不符合物理规则,但游戏效果显然有这样的需求)。如上图所示,使用间接光来照亮物体是个好主意,但不够亮?增加间接光的亮度。
如何在Unity中为动态物体提供间接光?这就引出了下面的主角——LightProbe。
0x02 LightProbe的核心
LightProbe主要解决如何在动态物体和角色上使用烘焙的光照信息。
事实上,LightProbe的核心是球面亮度信号的编码和重建。
Light-Probe-Interpolation-Using-Tetrahedral 如果你了解信号处理的话,你就会知道,只要信号满足一定的条件,就可以分解为一系列正弦谐波的总和,并且谐波频率以一定的幅度增加。多个频率,即所谓的傅里叶级数。
Lightprobe也采用了类似的想法,利用球谐函数对球体上的亮度信号进行编码。
类似地,原始亮度信号也可以分解为一系列带有缩放参数的基函数之和,我们只需要知道这些基函数的缩放系数,就可以在运行时快速重建原始亮度信号。
Spherical_Harmonics.png 但有一个问题,那就是如果想要完美地重建原始照明信号,显然需要很多很多甚至无限的球谐函数。但幸运的是,LightProbe 中保存的主要是一些低频光照信息。换句话说,它没有高频变化,所以如果我们通过丢弃所有较高频率来压缩球体上的频域数据,没有人会注意到。所以这里我们只能取有限的低频谐波函数。
在Unity中,烘焙GI中的LightProbe使用三阶球谐函数(9个参数),实时GI中的LightProbe使用二阶球谐函数(4个参数)。
OK,信号编码的问题解决了,另一个问题是运行时如何重构亮度信号。事实上,使用lightprobe的成本非常低,因为你只需要将缩放系数与其对应的基函数相乘,然后将结果求和即可得到近似的原始信号。
接下来我们看看Unity中的LightProbe中保存了哪些数据。
截图2018-04-20 PM 12.23.56.png 在Unity中,我们可以使用脚本将场景中的LightProbe保存为Asset,并且只要保证其以文本格式序列化,我们就可以直接查看其数据内容。
AssetDatabase.CreateAsset(Instantiate(LightmapSettings.lightProbes), "Assets/lightProbe.asset");您可以注意到的第一件事是“m_Tetrahedra”部分。
截图2018-04-21 9.27.39.png
这实际上是运行时LightProbe插值所需的四面体数据。因为如果要进行插值,显然需要知道需要哪些点进行插值,还需要知道每个点的权重。
在Unity中,根据角色的位置选择一个四面体,然后使用组成四面体的点进行插值。当然,也可以确定每个点的权重。
截图2018-04-21 AM 9.34.55.png 在下方位置,我们还可以找到烘焙后的球谐函数的系数。
截图2018-04-21 am 9.48.20.png 可以看到9个参数,3个通道,所以每个点总共有27个浮点数据。
综上可以看出,使用LightProbe时,计算开销并不大,比较大的开销主要来自于内存的占用。
0x03 修改LightProbe数据 提亮角色
ok,简单介绍一下LightProbe的原理和实现。现在我们回到最初的问题,那么如何才能更合理地突出场景中的人物呢?
其实我们可以通过修改烘焙的LightProbe数据来实现这个需求。
光1.png
正如您在上图中看到的,角色已经融入到场景中。虽然这样比较现实,也符合物理规律,但我想这对于很多人来说显然不是一个好的效果。如果角色能再突出一点就更好了。
幸运的是,Unity提供了获取烘焙LightProbe数据的接口:
varprobes=LightmapSettings.lightProbes.bakedProbes; BakedProbes 存储了一堆“SphericalHarmonicsL2”对象。您可以通过修改SphericalHarmonicsL2 的缩放比例来修改LightProbe 提供的亮度。
除了修改亮度之外,有时我们还希望角色有不同的环境光效果,以更加突出角色。这时我们可以通过SphericalHarmonicsL2中定义的AddAmbientLight方法来实现:
探针.AddAmbientLight(颜色);提亮并修改环境颜色后,我们的角色在场景中将如下所示。比实时照明更自然且更便宜。
【深入探讨:光探针(LightProbe)原理解析与数据编辑技巧】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直对光照效果很感兴趣,这篇文章提到的LightProbe原理听起来很有意思。
有14位网友表示赞同!
想了解一下LightProbe是怎么把环境光的细节传送到着色的模型上的。
有5位网友表示赞同!
学习下LightProbe数据的修改方法,希望能自己调整场景的光线效果。
有13位网友表示赞同!
最近在做游戏开发,如果能掌握LightProbe的话,渲染效果肯定会提升很多。
有18位网友表示赞同!
看了标题想起之前玩的游戏里一些光照做的特别真实的场景,Wonder是用的什么技术?
有14位网友表示赞同!
这篇博文应该会介绍几个常用的LightProbe算法吧?感觉LightProbe的实现方式挺复杂的。
有18位网友表示赞同!
想要看一看详细的代码实现,这样才能更好地理解LightProbe工作原理。
有13位网友表示赞同!
对修改LightProbe数据感兴趣,想看看有哪些实用的工具和技巧。
有16位网友表示赞同!
以前没见过这种技术,很有学习价值,希望作者讲到一些应用场景
有19位网友表示赞同!
最近在试着自己建模型渲染,如果能用上LightProbe,效果会更逼真!
有10位网友表示赞同!
我一直觉得光影细节决定游戏画面质量,LightProbe这个技术看起来很厉害。
有15位网友表示赞同!
不知道LightProbe的数据修改对资源占用有什么影响?希望作者也能讲到这方面的内容
有14位网友表示赞同!
期待文章能详细介绍LightProbe的优点和缺点,以及应用范围?
有20位网友表示赞同!
如果能够通过修改LightProbe数据来调整游戏中的气氛和氛围,那真是太棒了!
有13位网友表示赞同!
想了解什么样的人群可以使用这个技术?是专门的程序员吗?
有15位网友表示赞同!
LightProbe能应用在电影渲染中吗?我猜测应该可以吧?
有6位网友表示赞同!
看了标题感觉这篇文章会很专业,需要好好研究一下才能理解全!
有12位网友表示赞同!
文章里会介绍一些案例分析吗?想看看实际应用的例子。
有15位网友表示赞同!
LightProbe这个技术发展到了什么阶段?未来将会有哪些改进方向?
有15位网友表示赞同!