找回密码
 注册帐号

扫一扫,访问微社区

士郎 Unity3D实时体积光(二)

32
回复
4439
查看
[ 复制链接 ]
排名
1
昨日变化

7752

主题

8308

帖子

3万

积分

Rank: 16

UID
1231
好友
186
蛮牛币
10622
威望
30
注册时间
2013-7-29
在线时间
3983 小时
最后登录
2019-5-23

活力之星原创精华达人突出贡献奖财富之证游戏蛮牛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
回复

使用道具 举报

4四处流浪
320/500
排名
8010
昨日变化

0

主题

11

帖子

320

积分

Rank: 4

UID
237451
好友
0
蛮牛币
363
威望
0
注册时间
2017-8-14
在线时间
155 小时
最后登录
2019-5-27
2018-10-11 13:47:08 显示全部楼层
{:90:}{:90:}{:90:}
回复 支持 反对

使用道具 举报

7日久生情
1762/5000
排名
1989
昨日变化

6

主题

535

帖子

1762

积分

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

UID
54335
好友
2
蛮牛币
5455
威望
0
注册时间
2014-11-9
在线时间
539 小时
最后登录
2019-5-27
2018-10-11 13:53:42 显示全部楼层
回复

使用道具 举报

排名
17380
昨日变化

0

主题

21

帖子

84

积分

Rank: 2Rank: 2

UID
289412
好友
0
蛮牛币
30
威望
0
注册时间
2018-7-11
在线时间
25 小时
最后登录
2019-5-22
2018-10-11 15:29:13 显示全部楼层
不知道对CG优化有用没有,看看再说
回复 支持 反对

使用道具 举报

4四处流浪
304/500
排名
8821
昨日变化

3

主题

84

帖子

304

积分

Rank: 4

UID
194927
好友
0
蛮牛币
101
威望
0
注册时间
2016-12-21
在线时间
79 小时
最后登录
2019-4-24
2018-10-11 17:19:32 显示全部楼层
牛逼啊
回复

使用道具 举报

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

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偶尔光临
279/300
排名
14229
昨日变化

9

主题

103

帖子

279

积分

Rank: 3Rank: 3Rank: 3

UID
288527
好友
0
蛮牛币
3072
威望
0
注册时间
2018-7-4
在线时间
95 小时
最后登录
2019-3-22
2018-10-12 08:49:43 显示全部楼层
666666666666666666666666666666666
回复 支持 反对

使用道具 举报

7日久生情
1535/5000
排名
3443
昨日变化

0

主题

895

帖子

1535

积分

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

UID
210390
好友
0
蛮牛币
1835
威望
0
注册时间
2017-3-7
在线时间
206 小时
最后登录
2019-5-23
2018-10-12 09:23:18 显示全部楼层
回复

使用道具 举报

7日久生情
1703/5000
排名
19947
昨日变化

12

主题

779

帖子

1703

积分

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

UID
158776
好友
2
蛮牛币
77
威望
0
注册时间
2016-7-26
在线时间
885 小时
最后登录
2019-5-16
2018-10-12 10:44:43 显示全部楼层
楼主给个工程学习一下呗
回复 支持 反对

使用道具 举报

5熟悉之中
590/1000
排名
4498
昨日变化

0

主题

91

帖子

590

积分

Rank: 5Rank: 5

UID
282652
好友
1
蛮牛币
3217
威望
0
注册时间
2018-5-24
在线时间
173 小时
最后登录
2019-5-11
2018-10-12 10:54:53 显示全部楼层
实时体积光
回复

使用道具 举报

5熟悉之中
878/1000
排名
5173
昨日变化

1

主题

301

帖子

878

积分

Rank: 5Rank: 5

UID
258102
好友
1
蛮牛币
1158
威望
0
注册时间
2017-12-6
在线时间
298 小时
最后登录
2019-5-27
2018-10-12 14:52:52 显示全部楼层
回复

使用道具 举报

3偶尔光临
210/300
排名
14229
昨日变化

0

主题

54

帖子

210

积分

Rank: 3Rank: 3Rank: 3

UID
246859
好友
0
蛮牛币
398
威望
0
注册时间
2017-9-30
在线时间
98 小时
最后登录
2019-5-27
2018-10-13 13:38:52 显示全部楼层
厉害厉害,希望别卡死
回复 支持 反对

使用道具 举报

3偶尔光临
204/300
排名
9577
昨日变化

0

主题

19

帖子

204

积分

Rank: 3Rank: 3Rank: 3

UID
299303
好友
0
蛮牛币
306
威望
0
注册时间
2018-10-9
在线时间
68 小时
最后登录
2019-4-5
2018-10-13 21:51:56 显示全部楼层
牛逼,mark一下,以后肯定有用
回复 支持 反对

使用道具 举报

排名
34883
昨日变化

0

主题

23

帖子

49

积分

Rank: 1

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

使用道具 举报

2初来乍到
133/150
排名
31429
昨日变化

0

主题

86

帖子

133

积分

Rank: 2Rank: 2

UID
890
好友
0
蛮牛币
24
威望
0
注册时间
2013-7-15
在线时间
37 小时
最后登录
2019-4-25
2018-10-15 17:22:10 显示全部楼层
不错,参考参考
回复

使用道具 举报

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

本版积分规则