【游戏技术群】959392658  【游戏出海群】12067810
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2422

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

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

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

[士郎] Unity3D实时体积光(二)

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

7318

主题

7860

帖子

3万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
8812
威望
30
注册时间
2013-7-29
在线时间
3742 小时
最后登录
2019-2-22

社区QQ达人活力之星原创精华达人突出贡献奖财富之证游戏蛮牛QQ群会员蛮牛妹VIP

发表于 2018-10-11 10:58:42 | 显示全部楼层 |阅读模式

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

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

x
在上一节中(点击此处),我们使用Ray march算法,在降采样的RenderTexture中实现了一套体积光,然而,我们发现,体积光在采样率较低,采样目标点远的时候,采样点之间间隔太大,就会出现难看的斑驳。Unreal Engine 4在体积光的实现上解决方案是通过原生分辨率和较高的采样率,并在屏幕空间下完成基于深度的模糊,进而增加体积光的平滑度,这样的方法虽然效果好,却大大增加了对显存和GPU流处理器的压力,因此我们这里需要一个更Trick,更高效的方法,实现一个低消耗且效果较好的体积光。
首先,我们的测试场景如下,几个方块并在一起,体积光从缝隙间泻下,这对于采样精度有较高的要求,策划常要求我们在室内的百叶窗上创造出这样的效果,以增加室内渲染的意境:
1.jpg

我们的测试场景
我们的第一个实现目标,在4次采样时让体积光拥有一个大致的轮廓,要知道4次采样+降采样的RT,对于体渲染来说条件是十分苛刻的,首先在没有随机采样的情况下,效果如下:
2.jpg
完全错位的体渲染
可以看到,体渲染完全错位,完全没有办法表现体积光的效果,我们需要对其进行优化。首先第一个优化就是使不同像素使用完全不同的采样,使整个画面闪烁起来,然后通过我们之前讲过的基于深度的正态模糊和降采样,进一步降低性能消耗,这一套流程的实现结果如下:
3.jpg
首先我们可以看到,图中的光影交织部分有大量的噪点,这得益于我们的随机算法,代码如下:
4.jpg
这段代码截取自Raymarch函数,看起来复杂,实际原理非常简单,首先,前几句我们确定了final, step, seed这几个变量,final顾名思义,是raymarch采样的终点,而rayStart和rayDir毫无疑问就是采样的起点和方向了,我们通过线性插值在采样的起点和终点间采样,因此Step则记录每一步插值权重的步长,而step.y则看起来有些不易理解,其实他的作用是确定随机采样的范围,我们将其手动设置为0.4,意思是上一个采样点在-0.5的位置,下一个采样点在1.5的位置,而当前采样点的理想采样点应该是0.5处,这时我们的随机范围则应该停留在0.1到0.9之间,这样设计的目的是每一个采样点都有较大的随机范围,同时总采样距离相对一致且采样点之间不会重复采样或交叉采样,影响渲染正确性,而这个随机算法也很有意思,图中调用的random函数定义如下:
#define random(seed) sin(seed * 641.5467987313875 + 1.943856175)
我们看到,这其实是一个非常简单的利用sin函数进行一个魔数偏移的伪随机,由于sin函数的分布相对均匀且我们这里每次偏移数值较大,可以保证一定范围内采样的随机性和均匀性,而这一句
float seed = random((_ScreenParams.y * screenPos.y + screenPos.x) * _ScreenParams.x + _RandomNumber);
才是我们这里随机计算的点睛之笔,_RandomNumber是一个依靠脚本传输的随机数,每帧都是不一样的,而上边的这一句其实是将整张图想象成一个二维数组,而UV则是数组的索引值,因此通过对这个“数组”的降维处理,获得每个像素点独一无二的随机种子,接下来的代码就非常好理解了,将每个随机数生成的种子重复利用,并生成一个区间在[-1,1]的随机数,使其配合上述的raymarch流程工作。
5.jpg
当屏幕充满噪点,我们需要的是将其进行双边采样和双边滤波降低整个屏幕噪点的尖锐程度。(双边滤波实际并不能降低噪点的闪烁,只能让噪点看起来变的不那么扎眼)。双边模糊的核心代码如下:
6.jpg
双边模糊的代码虽然长,可是却非常容易理解,本质就是一个正态的分布,只是通过提前升采样和双线性过滤获得一张与屏幕分辨率相同的RenderTexture,并通过像素深度改变采样权重,这样使得体积光在缝隙密集的地方表现的更佳了。
最后,按照国际惯例,下雨天随机采样总是与Temporal Filter更搭,我们使用Unity官方提供的Post Processing Stack V2的TAA,提高画面的整体顺滑度。
事实上我们的代码非常高效,即使在64次采样下,性能消耗也几乎可以忽略不计,在笔者的老旧笔记本上,只用了0.5ms,未来移植移动端已然不是梦。
16次采样下,加上Temporal Filter,可以看到噪点已经大大减少:
7.jpg
64次采样下,效果非常完美:
8.jpg
9.jpg
知乎@MaxwellGeng

跟我念“站长妹纸萌萌哒!”我说站长,你说YO!爱你们么么哒~
回复

使用道具 举报

3偶尔光临
242/300
排名
8833
昨日变化
98

0

主题

8

帖子

242

积分

Rank: 3Rank: 3Rank: 3

UID
237451
好友
0
蛮牛币
318
威望
0
注册时间
2017-8-14
在线时间
100 小时
最后登录
2019-2-22
发表于 2018-10-11 13:47:08 | 显示全部楼层
{:90:}{:90:}{:90:}

回复 支持 反对

使用道具 举报

7日久生情
1547/5000
排名
2133
昨日变化
5

5

主题

471

帖子

1547

积分

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

UID
54335
好友
2
蛮牛币
5411
威望
0
注册时间
2014-11-9
在线时间
425 小时
最后登录
2019-2-22
发表于 2018-10-11 13:53:42 | 显示全部楼层

回复

使用道具 举报

排名
17255
昨日变化
9

0

主题

21

帖子

81

积分

Rank: 2Rank: 2

UID
289412
好友
0
蛮牛币
39
威望
0
注册时间
2018-7-11
在线时间
22 小时
最后登录
2019-1-22
发表于 2018-10-11 15:29:13 | 显示全部楼层
不知道对CG优化有用没有,看看再说

回复 支持 反对

使用道具 举报

3偶尔光临
291/300
排名
9028
昨日变化
1

3

主题

84

帖子

291

积分

Rank: 3Rank: 3Rank: 3

UID
194927
好友
0
蛮牛币
136
威望
0
注册时间
2016-12-21
在线时间
74 小时
最后登录
2019-2-20
发表于 2018-10-11 17:19:32 | 显示全部楼层
牛逼啊

回复

使用道具 举报

2初来乍到
130/150
排名
15176
昨日变化
3

1

主题

49

帖子

130

积分

Rank: 2Rank: 2

UID
294308
好友
0
蛮牛币
42
威望
0
注册时间
2018-8-22
在线时间
30 小时
最后登录
2019-1-16
发表于 2018-10-11 19:58:51 | 显示全部楼层
[/quote]{:87:}{:87:}{:87:}{:87:}

回复 支持 反对

使用道具 举报

3偶尔光临
277/300
排名
14098
昨日变化
3

9

主题

102

帖子

277

积分

Rank: 3Rank: 3Rank: 3

UID
288527
好友
0
蛮牛币
2700
威望
0
注册时间
2018-7-4
在线时间
94 小时
最后登录
2019-2-16
发表于 2018-10-12 08:49:43 | 显示全部楼层
666666666666666666666666666666666

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1456/1500
排名
3659
昨日变化
4

0

主题

856

帖子

1456

积分

Rank: 6Rank: 6Rank: 6

UID
210390
好友
0
蛮牛币
1766
威望
0
注册时间
2017-3-7
在线时间
194 小时
最后登录
2019-2-18
发表于 2018-10-12 09:23:18 | 显示全部楼层

回复

使用道具 举报

7日久生情
1701/5000
排名
19810
昨日变化
3

12

主题

781

帖子

1701

积分

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

UID
158776
好友
2
蛮牛币
149
威望
0
注册时间
2016-7-26
在线时间
880 小时
最后登录
2019-1-17
发表于 2018-10-12 10:44:43 | 显示全部楼层
楼主给个工程学习一下呗

回复 支持 反对

使用道具 举报

5熟悉之中
537/1000
排名
4820
昨日变化
22

0

主题

88

帖子

537

积分

Rank: 5Rank: 5

UID
282652
好友
1
蛮牛币
2947
威望
0
注册时间
2018-5-24
在线时间
147 小时
最后登录
2019-2-22
发表于 2018-10-12 10:54:53 | 显示全部楼层
实时体积光

回复

使用道具 举报

5熟悉之中
778/1000
排名
5382
昨日变化
2

1

主题

270

帖子

778

积分

Rank: 5Rank: 5

UID
258102
好友
1
蛮牛币
951
威望
0
注册时间
2017-12-6
在线时间
245 小时
最后登录
2019-1-29
发表于 2018-10-12 14:52:52 | 显示全部楼层

回复

使用道具 举报

排名
26801
昨日变化
5

0

主题

38

帖子

91

积分

Rank: 2Rank: 2

UID
246859
好友
0
蛮牛币
13
威望
0
注册时间
2017-9-30
在线时间
39 小时
最后登录
2019-1-7
发表于 2018-10-13 13:38:52 | 显示全部楼层
厉害厉害,希望别卡死
[发帖际遇]: 一个袋子砸在了 Utskui 头上,Utskui 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

3偶尔光临
172/300
排名
10119
昨日变化
6

0

主题

14

帖子

172

积分

Rank: 3Rank: 3Rank: 3

UID
299303
好友
0
蛮牛币
298
威望
0
注册时间
2018-10-9
在线时间
52 小时
最后登录
2019-2-15
发表于 2018-10-13 21:51:56 | 显示全部楼层
牛逼,mark一下,以后肯定有用

回复 支持 反对

使用道具 举报

排名
34628
昨日变化
8

0

主题

22

帖子

46

积分

Rank: 1

UID
92327
好友
1
蛮牛币
18
威望
0
注册时间
2015-4-15
在线时间
16 小时
最后登录
2018-10-14
发表于 2018-10-14 16:45:22 | 显示全部楼层
谢谢分享 ,,,,

回复

使用道具 举报

2初来乍到
117/150
排名
31226
昨日变化
12

0

主题

70

帖子

117

积分

Rank: 2Rank: 2

UID
890
好友
0
蛮牛币
25
威望
0
注册时间
2013-7-15
在线时间
37 小时
最后登录
2019-2-12

社区QQ达人

发表于 2018-10-15 17:22:10 | 显示全部楼层
不错,参考参考

回复

使用道具 举报

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

本版积分规则

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