游戏蛮牛学习群(纯技术交流,不闲聊):959392658
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2370

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1494|回复: 50

[慕容小匹夫] 聊聊LightProbe原理实现以及对LightProbe数据的修改

[复制链接]  [移动端链接]
排名
2192
昨日变化
1

54

主题

297

帖子

3108

积分

Rank: 9Rank: 9Rank: 9

UID
44527
好友
61
蛮牛币
2623
威望
0
注册时间
2014-9-12
在线时间
578 小时
最后登录
2018-9-25

专栏作家活力之星认证开发者

发表于 2018-6-24 16:19:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 慕容小匹夫 于 2018-6-24 16:21 编辑

0x00 前言
最近工作比较忙,所以文章已经很久没有更新了。这篇小文的主题也是在出差的高铁上想到,因为最近和一些朋友聊天,发现他们中很多人的项目中都使用了多个实时光源。细问之下主要是某些物体,例如角色,在烘焙后的场景中显得不够突出,为了突出角色所以加入了更多的实时光源。但事实上这可能并非一个很好的选择。

0x01 间接光还是直接光
下面这张图片演示了只有直接光照以及加上了间接光照之后的对比。

可以看到,直接光照抵达不到的地方的黑暗的部分要通过间接光照来照亮,而不是为了提高暗部的亮度再加一盏实时灯光。
事实上,如果场景中有大量的灯光——例如如果在上图中为室内增加大量补光来提高室内亮度——
还会造成场景中的明暗对比降低,画面显得更“平”。
这也是很多朋友的项目中场景中存在的一个比较常见的问题,即亮度不够灯光补。补着补着才发现,整个场景已经充斥了太多的灯光了,而场景也因此整体很亮,没有了明暗对比,结果就是视觉效果平的不真实。
相信各位也一定想到了,亮度不够灯光补这个思路的另一个实践——场景内的角色不够亮时也选择使用一个灯光来给角色补光——同样存在着和之前所说的一样的问题。
那么怎么提亮角色才更加合理一些呢?(虽然提亮角色这件事本身就不符合物理规则,但是为了游戏效果显然存在这样的需求)。如上图所示那样,利用间接光来照亮物体是一个不错的思路,不够亮?提高间接光的亮度。
在Unity中如何给动态物体提供间接光?这就引出了下面的主角——LightProbe。

0x02 LightProbe的核心
LightProbe主要解决了如何在动态对象和角色上使用烘焙的照明信息。
其实LightProbe的核心就是球面亮度信号编码和重建。
如果大家了解信号处理方面的知识的话,就会知道只要信号满足一定条件,就可以分解为一系列正弦谐波的和,谐波频率以倍频增长,这就是所谓的傅立叶级数。
而lightprobe也采用了类似的思路,使用了球谐函数来对该球面上的亮度信号进行编码。
同样的,一个原始的亮度信号也可以分解为一系列带缩放参数的基函数之和,而我们只需要知道这些基函数的缩放系数就可以在运行时快速的重建原始的亮度信号了。
但是有一个问题,那就是如果要完美的重建原始光照信号的话,显然需要很多很多甚至是无穷项球谐函数。但是好在LightProbe中保存的主要是一些低频的光照信息,换句话说,它没有高频率变化,所以如果我们通过丢弃所有更高的频率来压缩球体上的频域数据,没有人会注意到。所以这里我们可以只取有限的低频谐函数。
在Unity中,烘焙GI的LightProbe采用了3阶球谐函数(9个参数),实时GI中的LightProbe采用了2阶球谐函数(4个参数)。
OK,信号编码的问题解决了,另一个问题即在运行时如何重建亮度信号。其实使用lightprobe的开销很低,因为只需要将缩放系数与其对应的基函数相乘之后再求和的结果就是近似的原始信号。
接下来我来看看一个Unity中的LightProbe中保存了哪些数据吧。
在Unity中,我们可以使用脚本将场景内的LightProbe保存为一个Asset,并且只要保证使用文本格式进行序列化,我们就可以直接查看其数据内容了。
AssetDatabase.CreateAsset(Instantiate(LightmapSettings.lightProbes), "Assets/lightProbe.asset");
首先能够注意到的是“m_Tetrahedra”部分。

这个其实就是在运行时LightProbe插值时需要用到的四面体数据。因为如果要进行插值,显然要知道需要哪几个点来插值,同时还需要知道每个点的权重各是多少。
在Unity中会根据角色所在的位置,选择四面体,然后使用组成四面体的点进行插值,当然还可以确定每个点的权重。
在靠后的位置,我们还可以找到烘焙后的球谐函数的系数。
可以看到9个参数3个通道所以每一个点总共有27个float数据。
综上,可以看到在使用LightProbe时,计算开销并不大,相对来说比较大的开销主要来自对内存的占用。

0x03 修改LightProbe数据 提亮角色
ok,简单介绍了一下LightProbe的原理以及实现。下面我们还是回到最初的问题,那么怎么提亮一个场景内的角色才更加合理一些呢?
事实上我们可以通过修改烘焙后的LightProbe的数据来实现这样的需求。

可以看到上图中,角色已经和场景融为了一体。虽然这样更加真实和符合物理规则,但是我想对很多人来说这显然不是一个好的效果。角色还是能更加突出的好。
好在Unity提供了获取烘焙后的LightProbe数据的接口:
  var probes = LightmapSettings.lightProbes.bakedProbes;
bakedProbes内保存的是一堆“SphericalHarmonicsL2”对象,只要修改SphericalHarmonicsL2的缩放比例就可以修改LightProbe所提供的亮度了。
除了修改亮度之外,有时我们也会想让角色有不同的环境光效果,以更加突出角色。这时我们就可以通过SphericalHarmonicsL2中定义的AddAmbientLight方法来实现了:
  probe.AddAmbientLight(color);
提亮和修改环境色之后,我们的角色在场景中就成了下面这样。比实时光更加自然和开销更低。
当然,这里只是抛砖引玉,欢迎大家来讨论。
相关的脚本,可以在这里获取:
游客,如果您要查看本帖隐藏内容请回复

ref:
https://en.wikipedia.org/wiki/Delaunay_triangulation
https://www.gdcvault.com/play/1015312/Light-Probe-Interpolation-Using-Tetrahedral
https://en.wikipedia.org/wiki/Spherical_harmonics
[size=0em]​



回复

使用道具 举报

5熟悉之中
596/1000
排名
4281
昨日变化
28

2

主题

64

帖子

596

积分

Rank: 5Rank: 5

UID
282159
好友
0
蛮牛币
1027
威望
0
注册时间
2018-5-21
在线时间
198 小时
最后登录
2018-12-10
发表于 2018-6-25 09:37:16 | 显示全部楼层
很棒的处理方式!

回复

使用道具 举报

5熟悉之中
819/1000
排名
3168
昨日变化
2

0

主题

71

帖子

819

积分

Rank: 5Rank: 5

UID
233300
好友
0
蛮牛币
1123
威望
0
注册时间
2017-7-20
在线时间
296 小时
最后登录
2018-12-10
发表于 2018-6-25 10:19:53 | 显示全部楼层
厉害了,大佬
[发帖际遇]: 952168139 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
484/500
排名
17799
昨日变化

1

主题

184

帖子

484

积分

Rank: 4

UID
213085
好友
5
蛮牛币
343
威望
0
注册时间
2017-3-20
在线时间
265 小时
最后登录
2018-12-10
发表于 2018-6-25 10:37:14 | 显示全部楼层

回复

使用道具 举报

4四处流浪
484/500
排名
17799
昨日变化

1

主题

184

帖子

484

积分

Rank: 4

UID
213085
好友
5
蛮牛币
343
威望
0
注册时间
2017-3-20
在线时间
265 小时
最后登录
2018-12-10
发表于 2018-6-25 10:39:54 | 显示全部楼层

回复

使用道具 举报

7日久生情
3013/5000
排名
351
昨日变化

1

主题

377

帖子

3013

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
2219
好友
1
蛮牛币
8085
威望
0
注册时间
2013-8-19
在线时间
919 小时
最后登录
2018-12-10
发表于 2018-6-25 10:47:43 | 显示全部楼层
聊聊LightProbe原理实

回复 支持 反对

使用道具 举报

3偶尔光临
159/300
排名
12545
昨日变化
2

0

主题

34

帖子

159

积分

Rank: 3Rank: 3Rank: 3

UID
285839
好友
0
蛮牛币
320
威望
0
注册时间
2018-6-14
在线时间
57 小时
最后登录
2018-10-29
发表于 2018-6-25 11:00:51 | 显示全部楼层
熟能生巧

回复

使用道具 举报

5熟悉之中
698/1000
排名
4477
昨日变化

0

主题

41

帖子

698

积分

Rank: 5Rank: 5

UID
129504
好友
0
蛮牛币
491
威望
0
注册时间
2015-11-21
在线时间
341 小时
最后登录
2018-12-10
发表于 2018-6-25 11:27:47 | 显示全部楼层
6666666666666

回复

使用道具 举报

6蛮牛粉丝
1191/1500
排名
2273
昨日变化
2

0

主题

113

帖子

1191

积分

Rank: 6Rank: 6Rank: 6

UID
124559
好友
0
蛮牛币
1182
威望
0
注册时间
2015-10-4
在线时间
482 小时
最后登录
2018-12-10
QQ
发表于 2018-6-25 11:40:08 | 显示全部楼层
留着用,感觉长知识了

回复 支持 反对

使用道具 举报

7日久生情
1754/5000
排名
1317
昨日变化

13

主题

250

帖子

1754

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
99182
好友
0
蛮牛币
2763
威望
0
注册时间
2015-5-10
在线时间
593 小时
最后登录
2018-12-10
发表于 2018-6-25 12:00:38 | 显示全部楼层
最近刚好在学习这个组件,谢谢分享

回复 支持 反对

使用道具 举报

7日久生情
1780/5000
排名
1157
昨日变化

5

主题

214

帖子

1780

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
10760
好友
1
蛮牛币
3252
威望
0
注册时间
2013-12-20
在线时间
523 小时
最后登录
2018-12-1
发表于 2018-6-25 12:46:53 | 显示全部楼层
又看到小匹夫的发技术贴了,赞~

回复 支持 反对

使用道具 举报

7日久生情
1557/5000
排名
1690
昨日变化

1

主题

154

帖子

1557

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
180106
好友
2
蛮牛币
2898
威望
0
注册时间
2016-11-2
在线时间
652 小时
最后登录
2018-12-10
QQ
发表于 2018-6-25 13:25:24 | 显示全部楼层
学习学习

回复

使用道具 举报

6蛮牛粉丝
1126/1500
排名
4177
昨日变化

2

主题

344

帖子

1126

积分

Rank: 6Rank: 6Rank: 6

UID
238701
好友
1
蛮牛币
909
威望
0
注册时间
2017-8-21
在线时间
440 小时
最后登录
2018-12-10
发表于 2018-6-25 13:59:34 | 显示全部楼层
光照渲染非常重要,得努力学习

回复 支持 反对

使用道具 举报

7日久生情
3988/5000
排名
452
昨日变化

130

主题

668

帖子

3988

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
7831
好友
3
蛮牛币
6227
威望
0
注册时间
2013-11-12
在线时间
1292 小时
最后登录
2018-12-10

活力之星锦衣玉食

发表于 2018-6-25 14:02:27 | 显示全部楼层
                  
[发帖际遇]: 370688535 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
783/1000
排名
2654
昨日变化

0

主题

39

帖子

783

积分

Rank: 5Rank: 5

UID
113567
好友
0
蛮牛币
1024
威望
0
注册时间
2015-7-14
在线时间
216 小时
最后登录
2018-12-10
发表于 2018-6-25 14:34:54 | 显示全部楼层
谢谢分享!!!!!!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表