欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入探讨:光探针(LightProbe)原理解析与数据编辑技巧

时间:10-27 现代故事 提交错误

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原理听起来很有意思。

    有14位网友表示赞同!

断秋风

想了解一下LightProbe是怎么把环境光的细节传送到着色的模型上的。

    有5位网友表示赞同!

顶个蘑菇闯天下i

学习下LightProbe数据的修改方法,希望能自己调整场景的光线效果。

    有13位网友表示赞同!

箜明

最近在做游戏开发,如果能掌握LightProbe的话,渲染效果肯定会提升很多。

    有18位网友表示赞同!

莫名的青春

看了标题想起之前玩的游戏里一些光照做的特别真实的场景,Wonder是用的什么技术?

    有14位网友表示赞同!

怪咖

这篇博文应该会介绍几个常用的LightProbe算法吧?感觉LightProbe的实现方式挺复杂的。

    有18位网友表示赞同!

孤者何惧

想要看一看详细的代码实现,这样才能更好地理解LightProbe工作原理。

    有13位网友表示赞同!

墨染殇雪

对修改LightProbe数据感兴趣,想看看有哪些实用的工具和技巧。

    有16位网友表示赞同!

素颜倾城

以前没见过这种技术,很有学习价值,希望作者讲到一些应用场景

    有19位网友表示赞同!

◆残留德花瓣

最近在试着自己建模型渲染,如果能用上LightProbe,效果会更逼真!

    有10位网友表示赞同!

ok绷遮不住我颓废的伤あ

我一直觉得光影细节决定游戏画面质量,LightProbe这个技术看起来很厉害。

    有15位网友表示赞同!

青衫故人

不知道LightProbe的数据修改对资源占用有什么影响?希望作者也能讲到这方面的内容

    有14位网友表示赞同!

歇火

期待文章能详细介绍LightProbe的优点和缺点,以及应用范围?

    有20位网友表示赞同!

嗯咯

如果能够通过修改LightProbe数据来调整游戏中的气氛和氛围,那真是太棒了!

    有13位网友表示赞同!

闷骚闷出味道了

想了解什么样的人群可以使用这个技术?是专门的程序员吗?

    有15位网友表示赞同!

凝残月

LightProbe能应用在电影渲染中吗?我猜测应该可以吧?

    有6位网友表示赞同!

她的风骚姿势我学不来

看了标题感觉这篇文章会很专业,需要好好研究一下才能理解全!

    有12位网友表示赞同!

哭着哭着就萌了°

文章里会介绍一些案例分析吗?想看看实际应用的例子。

    有15位网友表示赞同!

嘲笑!

LightProbe这个技术发展到了什么阶段?未来将会有哪些改进方向?

    有15位网友表示赞同!

【深入探讨:光探针(LightProbe)原理解析与数据编辑技巧】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活