Unity Shader - 深度图基础及应用

Unity Shader - 深度图基础及应用,第1张

深度图里存放了 [0,1] 范围的 非线性分布 的深度值,这些深度值来自 NDC 坐标
在延迟渲染中,深度值默认已经渲染到G-buffer;而在前向渲染中,你需要去 申请 ,以便Unity在背后利用Shader Replacement将RenderType为Opaque、渲染队列小于等于 2500 并且有 ShadowCaster Pass 的物体的深度值渲染到深度图中。

第一步:在C#中设置CameramaindepthTextureMode = DepthTextureModeDepth;

可以在主摄像机的Camera组件下看见提示:

这表明了主摄像机渲染了深度图

第二步:在Shader中声明_CameraDepthTexture

第三步:访问深度图

利用覆盖屏幕的uv值和深度图中的深度,我们可以重建出物体在世界空间中的坐标。
主要有以下两种方法:

首先要在C#脚本中传递当前的VP逆矩阵:

然后在Shader中首先制造NDC坐标:

利用当前的VP逆矩阵将NDC坐标转换到世界空间:

具体用法可以到下面的MotionBlur例子中查看。

首先需要知道,Post Process实际上是渲染一个覆盖屏幕的Quad,因此屏幕四个角对应摄像机的视椎体四个角。
首先是算出摄像机到四个角的向量:

假设有个绿点在toTopLeft所在线上,利用相似三角形,可以得到:

而depth是能够在Shader中获得的,因此我们只需要传递toTopLeft / near到Shader中就能计算出toGreen:

在Vertex中判断出对应顶点所在的向量:

可以看到uv值和对应的索引值正好是二进制的关系,所以可以如下求出:

你可能奇怪这样只能求到4个角线上的点,但vertex到fragment的过程中是有个东西叫插值的,这个 插值 正好能把每个像素所在的向量求出。
然后我们就能在fragment中求出世界坐标了:

具体的用法可以到下面的垂直雾效例子中找到。

输出[0,1]范围的深度值即可,如下:

思路是判断当前物体的深度值与深度图中对应的深度值是否在一定范围内,如果是则判定为相交。
首先访问当前物体的深度值:

然后访问深度图。由于此时不是Post Process,因此需要利用投影纹理采样来访问深度图:

最后就是进行相交判断:

在相交高亮效果的基础上,加上 半透明 边缘高亮 ,就能制造出一个简单的能量场效果:

思路是让雾的浓度随着深度值的增大而增大,然后进行的原图颜色和雾颜色的插值:

思路与相交高亮效果类似,只是这里是Post Process。自定义一个[0,1]变化的值_CurValue,根据_CurValue与深度值的差进行颜色的插值:

利用上面提到的第二种重建世界空间坐标的方法得到世界空间坐标,判断该坐标的Y值是否在给定阈值下,如果是则混合原图颜色和水的颜色:

利用上面提到的第二种重建世界空间坐标的方法得到世界空间坐标,让雾的浓度随着Y值变化:

思路是取当前像素的附近4个角,分别计算出两个对角的深度值差异,将这两个差异值相乘就得到我们判断边缘的值。
首先是得到4个角:

然后是得到这4个角的深度值:

最后就是根据对角差异来得到判断边缘的值:

运动模糊主要用在竞速类游戏中用来体现出速度感。这里介绍的运动模糊只能用于 周围物体不动,摄像机动 的情景。
思路是利用上面提到的重建世界坐标方法得到世界坐标,由于该世界坐标在摄像机运动过程中都是不动的,因此可以将该世界空间坐标分别转到摄像机运动前和运动后的坐标系中,从而得到两个NDC坐标,利用这两个NDC坐标就能得到该像素运动的轨迹,在该轨迹上多次取样进行模糊即可。
首先是得到世界坐标(这里使用提到的第一种重建方法):

然后是计算出运算前后的NDC坐标:

最后就是在轨迹上多次取样进行模糊:

景深是一种聚焦处清晰,其他地方模糊的效果,在摄影中很常见。
思路是首先渲染一张模糊的图,然后在深度图中找到聚焦点对应的深度,该深度附近用原图,其他地方渐变至模糊图。
第一步是使用SimpleBlur Shader渲染模糊的图,这里我只是简单地采样当前像素附近的9个点然后平均,你可以选择更好的模糊方式:

第二步就是传递该模糊的图给DepthOfField Shader:

第三步就是在DepthOfField Shader中根据焦点来混合原图颜色和模糊图颜色:

>在这一节中,我想要探讨一下究竟那些官方自营或者官方推荐的第三方插件能够给Gaia原生场景带来多大的画面效果提升。

新建一个项目,仅安装Gaia。直接使用Session Manager执行自带的“GS Example 4”,得到一个Gaia场景“River Island”。

简单烘焙下灯光,将摄影机移动到一个合适的位置,可以得到如下画面效果:

使用Gaia内置的功能添加Player、天空、水体、Post Processing等效果,并在GX面板中将Ambient Skies Samples的“Skies”设置成预设“Day”,执行一次“Bake Lighting”(这里为了尽快看到结果,可以禁用“Realtime Global Illumination”,并切换成“GPU Progressive”方式),将“Post Processing”设置成预设“Default Day”,得到的结果是这样的:

如果删除Post Processing,效果是这样的:

换一个角度,Gaia原生水体的表现是这样的(这里我关掉了Post Processing的Bloom和Lens Distortion):

下面我们安装Ambient Skies完整版。刚刚安装好的时候,在Gaia Manager中是看不到完整版的,需要先让Ambient Skies完成初始化(打开Ambient Skies的窗口直到能正常设置Ambient Skies为止)。

完成之后,Gaia Manager的GX栏中就是完整版的Ambient Skies了,Ambient Skies窗口也可以正常打开,但场景的光照发生了翻天覆地的变化。

在Ambient Skies窗口勾选上“Enable Skies”,将“Global Settings”中的“System Type”设置为“Ambient HDRI Skies”,然后在“Profile Settings”中选择任意“Skybox Profile”,就可以得到形态各异的天光照明效果了。

我们可以在“Skies”栏中调节关于阳光(Sun)、天空盒(Skybox)、环境光照(Ambient)、雾效(Fog)、阴影(Shadow)和水平线(Horizon)的相关参数,在“Post FX”栏中调整关于Post Processing的所有设置,在“Lighting”栏中进行灯光烘焙相关设置。基本上,Ambient Skies将所有与灯光和渲染相关的设置都集成到一起,非常非常的方便。

目前这个效果对我来说太“暗”了,所以我将Post FX中的Auto Exposure Settings中的Exposure Amount增加到15,效果是这样的:

另外,Post FX栏中还提供了很多预设好的Post Processing Profile供用户选择,非常的贴心。

下面是Sample版和完整版Ambient Skies的效果对比:

可以发现,完整版Ambient Skies从效果上来说比Sample版确实要好一些,但这种“好”并没有好到非买不可的程度。但从使用的方便性和可调整性上来说,完整版就好太多了。不仅提供了更多更多样化的预设Profile给用户选择,还将Unity有关于灯光和渲染的相关的设置都集中到了一个面板之中。这对于需要进行大量室外灯光设置的用户来说,是非常实用的。

Ambient Skies中并没有关于水的内容,我也没有找到完整版的Ambient Water插件,所以只能安装AQUAS 2020来试图获得更好的水体表现。

将场景中的Ambient Water Samples设置为“不激活”,使用AQUAS的“Setup Wizard”为场景添加AQUAS水体:

Unity的默认渲染管线是不支持体积光的,Ambient Skies也只能用雾效来模拟大气效果。想要真正的体积光效,只能选择使用HDRP或者比如Aura 2这样的第三方插件了。

安装好Aura 2之后,首先需要给相机和主光源上添加Aura相关组件,然后在Aura 2的面板中选择预设“Sunny Day”,就可以得到这样的效果了:

安装完CTS 2019之后,先关闭Aura 2的效果,并将Ambient Skies恢复成预设“Sky Five High”(也就是前面测试Ambient Skies完整版时使用的预设效果)。然后应用CTS 2019预装的“CTS_Profile_G6_Basic Warm”配置,得到如下效果:

简单地调整了一下(岩石贴图的重复度、法线强度、雪效果等等),恢复Aura 2的效果,重新应用“Sunny Day”预设,得到的画面效果如下:

下面是这一系列测试的渲染效果对比图:

通过这样的比较,应该不难发现,Gaia还是比较依赖其他各种第三方插件的。首先,CTS 2019几乎是“必须”的,否则根本没办法解决诸如贴图拉伸、雪地效果等问题;其次,Ambient Skies对Gaia场景表现的提升也很明显,而且Ambient Skies可以用于任何室外光照环境,很实用;第三,自带的Ambient Water Samples的效果只能说“一般”,如果场景有大量的水体,建议还是要弄一份AQUAS 2020的;最后,如果不使用HDRP的话,必须依赖Aura 2这样的第三方插件来获得体积光效果,而体积光效对于室外场景的表现有极大地帮助。

最后还想补充一点关于HDRP的问题。

Embient Sky对于HDRP支持得比较好,毕竟其实它也就是将灯光、渲染、后期、烘焙等相关内容整合到一个面板中然后再添加许多预设Profile嘛。

但Gaia本体就不太推荐使用HDRP了,它是支持HDRP的啦,但因为HDRP自己也是不断在更新,所以Gaia和最新版本的HDRP总有些不太契合的地方。另外,Gaia自带的Tree资源都是来自于SpeedTree(当然这也是大家的第一选择啦),但SpeedTree的材质并不支持HDRP,HDRP的自动转换工具目前也不能自动将SpeedTree材质升级为HDRP材质,所以用起来就比较麻烦了。

CTS 2019因为涉及到Shader的问题,对HDRP的支持是非常有限的,仅支持几个特定版本的HDRP,而且也都不是新版。这个问题估计只能等到HDRP比较成熟稳定之后才能解决吧,毕竟每个版本都追对于CTS的开发来讲也是挺浪费人力物力的。

1、打开醒图软件,打开,复制图层。
2、点击新建图层,填充成黑色,点击滤镜--渲染--分层云彩,点击通道,把任意通道载入选区,再回到图层,复制选区。
3、隐藏分层云彩图层,点击复制的图层把图层混合模式改为滤色,再点击添加蒙版,用橡皮擦工具把人物主体擦出来。
4、降低烟雾的不透明度,使烟雾更加自然,也可以复制图层调整大小、位置和不透明度使烟雾更有层次感,这样烟雾效果就做好了。以上就是醒图加烟雾的方法。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13401710.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-29
下一篇 2023-07-29

发表评论

登录后才能评论

评论列表(0条)

保存