找回密码
 立即注册
查看: 393|回复: 0

[笔记] 【unity URP】体积云笔记

[复制链接]
发表于 2021-12-22 12:28 | 显示全部楼层 |阅读模式
【References】
【简介】
本人在URP管线中学习了体积云的渲染,可终于把想法的flag给全部完成啦!有一说一,纯shader代码很好写文章,后处理系列这种用到很多地方反而不太好反向调整代码,所以这里主要介绍做体积云的思路。下一步看看做一波二次元渲染,在这次体积云的渲染主要参考上述参考文章的思路,同时会增加比较仔细的代码介绍。主要可能比较懒再做一份,所以介绍代码思路,并且附上源代码,源代码的注释很全面,可以直接拿来进行使用。

体积云视频,可能噪声不太好
https://www.zhihu.com/video/1449003898211700736
基础URP后处理逻辑可以看我的体积光文章,在本文中便不再重复搭建后处理逻辑内容:
【正文】
首先,体积云要怎么做呢?引入包围盒,然后基于包围盒判断当前射线位置,得到云朵具体密度并且进行反馈,得到当前体积云的密度大小,基于体积云密度的大小来得到最终的光照效果。
所以,我们需要准备一些前提材料,例如世界空间的位置,这里通过反向VP矩阵变换可以基于深度图得到世界空间位置:



获得世界空间坐标位置



矩阵汇入位置



世界空间坐标位置

包围盒的距离比较容易,通过多次min进行判断,得到当前位置到达盒子的距离,与盒子在里面的距离大小:



得到包围盒的距离

完成之前的操作之后,我们可以做体积云啦!体积云的本质是通过基于摄像机,往视角方向打射线,然后判断是否与包围盒碰撞,而这里的包围盒就是我们的云朵位置啦!



往视角方向打射线,判断光照结果



判断体积云点

============================================
接着根据当前位置,得到对应的云朵密度,接着在云朵的密度中,本人加入了基于包围盒的UVxz方向进行采样的uv操作,以及加入视角方向的修正,达到噪音跟着摄像机能够保持相对不动的效果:



基于包围盒的uv修正

完成这一步之后,拿着uv对汇入的3D噪音进行采样,得到3D噪音效果,这里还加入一张遮罩噪音,来进行对噪音再扰动采样,避免噪音采样具有过分的重复性:



遮罩噪音



对3D噪音的采样位置

采样完3D噪音之后,对噪音的整体效果进行修正,得到最终的噪音效果



最终的噪音算法



噪音输出效果

完成3D噪音之后,我们加入边缘的修正,边缘修正主要通过得到边缘的x与z的最小值,对边框进行缩放:



边框缩放

接着汇入一张天气图,也是基于摄像机与包围盒的uv逻辑采样,得到体积云的缩放效果:



天气图



效果图

具体输出到Alpha通道,给颜色插值进行使用。



输出alpha图

======================================
完成密度采样之后,我们需要进行光照确认,光照确认主要通过当前射线位置与射线穿过的位置来进行判断,汇入当前采样密度的位置,来计算出光线穿过的最终密度程度,加入云朵散射效果可以得到散射透光,加入透光便可以达到具体效果:



云朵光照确认代码位置



输出光照结果

=================================================
接着,我们把最终的光照与总密度输出,在输出前降采样,运用双重模糊的逻辑进行升采样,得到最终的体积云效果,可以通过这一步大幅度降低消耗:



双重模糊的升采样操作



没有降采样11.8ms



降采样的1.1ms

接着,我们还需要修复采样扰动,这里通过汇入一张



密度高的噪音图



对步长修正



修复效果,能够降低很多平滑线

================================
源代码:
链接:https://pan.baidu.com/s/1dsBtq5EWVhxGVaz7vPateg
提取码:fbfb

本帖子中包含更多资源

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

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-11 15:30 , Processed in 0.140162 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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