欢迎光临散文网 会员登陆 & 注册

【转】四种体积光的写法:RayMarching、径向模糊、Noise造假术、挤出造假术(包含URP

2023-09-07 04:50 作者:ACFUN-AK  | 我要投稿

四种体积光的写法:RayMarching、径向模糊、Noise造假术、挤出造假术(包含URP、Build-In、ASE不同实现,并附带源码)

四种体积光的写法:RayMarching、径向模糊、Noise造假术、挤出造假术(包含URP、Build-In、ASE不同实现,并附带源码)

智慧之水Aqua

加入阿库西斯教吧!厄里斯的胸是垫出来的!

81 人赞同了该文章

一.效果预览 与 对比

Volumetic Light性能与表现的取舍之道,总有一款适合那你的项目(文末源码附上)

1.方案一:RayMarching

特点:效果一流且稳定,但多次采样ShadowMap比较消耗性能

2.方案二:光强Threshold + 径向模糊

特点:效果不够稳定,性能消耗适中(有点类似于Bloom的思想)

3.方案三:Noise造假术

特点:需要额外的模型,但特别省性能,表现效果也还不错(如果是面片,则搭配Billboard效果更佳)

4.方案四:挤出造假术

特点:性能高,效果还行。但对模型顶点数不能太少,否则模型挤出时会被整体偏移(拿一个Cube试试就知道是啥意思了)

二、具体分析

以下是不同方法的实现思路,请结合下载的源码食用更佳哦

方案一:RayMarching

大体步骤:①深度重建世界坐标系 ②步进式采样shadowMap,累计光强 ③模糊算法提高光强质感 ④混合体积光与原场景

首先:按照之前文章中提到的RenderFeature小框架,配置好RenderFeature,将RayMarching的RenderPass注入到管线中(到时候工程源码里会放这个小框架,不必担心额外下载,想要了解更多的话,这是小框架的讲解文章:智慧之水Aqua:URP RenderFeature通用框架(附源码与使用教程))

后面我们将按照VolumetricLight_RenderPass中,重写的Render( )函数展开分析(类似于Build-In中的OnRenderImage函数)

1.1深度重建世界坐标系

可参照文章: 智慧之水Aqua:深度重建世界坐标系的N种方法(附带源码)

1.2步进式采样shadowMap,累计光强

强烈推荐教我的赛博师傅: 李恒:【UnityShader】Volumetric Light 体积光(8)

接下来就是利用重建好的世界坐标系,进行shadowMap的采样了,比如采样下图的0, 1, 2, 3点。

比如下图:如果步进4次,那么就会对0, 1, 2, 3进行ShadowMap采样,这样0, 1点就累计到了光强,而2, 3点则没有。

于是就会出现这种情况

但明显能看到分层的情况,这是因为当步进次数不够大的时候,等距采样会出现刚好漏过洞口的情况,造成某一段地方的光强累计不够,从而出现分层。由此我们可以试试随机采样的效果

但这样却多了很多噪点,为了优化表现,我们可以用模糊算法来优化

1.3模糊算法提高光强质感

模糊算法依旧还是推荐毛大神的 毛星云:高品质后处理:十种图像模糊算法的总结与实现

1.4混合体积光与原场景

直接相加就好:sceneColor + lightColor

也可以柔性混合:sceneColor + sceneColor * lightColor

方案二:光强Threshold + 径向模糊

2.1提取高亮部分:屏幕空间中的灯光距离作为遮罩 + threshold过滤亮度值 = 生成亮度图

2.2使用径向模糊:营造发散的效果(这里不展开讲径向模糊,可以参考毛大神的)

2.3混合体积光与原场景

直接相加就好:sceneColor + lightColor

也可以柔性混合:sceneColor + sceneColor * lightColor

方案三:Noise造假术

3.1造假体积:Noise图拉长

3.2边缘消隐:上图明显边缘太硬了,我们可以用Fresnel + UV摆放形成遮罩,来控制一下边缘消隐

3.3VertexOffset做开合控制:效果是有了,但不太可控,所以利用遮罩做开合控制

方案四:挤出造假术

4.1顶点阶段的模型挤出:模型沿着背光方向,顶点挤出一定程度

4.2片元阶段控制衰减值:让挤出的部分呈现丁达尔效应

三、工程提供

百度网盘链接:pan.baidu.com/s/1rSl6rg 提取码:2233

Git链接:GitHub - RewriteHJ/Aqua-treasure-of-knowledge: 知识与你分享~

方案一:RayMarching

文件名:0002Volumetic Light / 0002RayMarchingVolumeticLight.unitypackage

下载后,新建一个URP工程,拖入Assets覆盖即可(测试版本为unity2021.3.26)

方案二:光强Threshold + 径向模糊

文件名:0002Volumetic Light / 0002RadialBlur_VolumetricLight.unitypackage

下载后,新建一个build-In工程,拖入Assets覆盖即可(测试版本为unity2021.3.26)

方案三:Noise造假术

文件名:0002Volumetic Light / 0002NoiseTrick_VolumetricLight.unitypackage

下载后,新建一个build-In工程,拖入Assets覆盖即可(测试版本为unity2021.3.26)

方案四:挤出造假术

文件名:0002Volumetic Light / 0002VertexExtrude_VolumetricLight.unitypackage

下载后,新建一个build-In工程,拖入Assets覆盖即可(测试版本为unity2021.3.26)

四、结语

总结的四种Volumetric Light的方法就到这里啦。沉下心来看,其实体积光特别容易实现。后续我还会更新一些 渲染案例、实用小工具、Houdini程序化之类的文章,如果能点个小小的关注就更好了,嘿嘿,全当时为了阿库娅sama。今天的分享就到这啦,下次再见!

B站主页:智慧之水Aqua的个人空间-智慧之水Aqua个人主页-哔哩哔哩视频

厄里斯的胸是垫出来的⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

发布于 2023-09-05 00:03


【转】四种体积光的写法:RayMarching、径向模糊、Noise造假术、挤出造假术(包含URP的评论 (共 条)

分享到微博请遵守国家法律