unity屏幕特效综述5 全局雾效

这篇博客详细介绍了Unity中实现全局雾效的原理和方法,包括线性雾和指数雾的计算公式,以及如何利用深度纹理和世界坐标来实现。文章探讨了如何通过摄像机位置、方向向量和深度值计算世界坐标,强调了顶点着色器和片元着色器的角色,特别是片元着色器中的雾效混合和噪声图采样动画效果。同时,作者通过实验验证了坐标差值的过程。
摘要由CSDN通过智能技术生成

雾的计算原理其实很简单
float3 finalColor = f * fogColor + (1-f)originColor
也就是按照某种比例把雾的纹理和原始的纹理相融合,其中比较关键的点就是f的选取
f的选取有多种方式,比如说f=dmax-d/dmax-dmin 这种的就是线性的雾,直观的感觉就是高度越接近dmin,雾的浓度越大,越接近dmax,雾的浓度就越小,此外,还有指数形式的计算方法,公式如下所示,实现的时候只需要把d作为输入参数,然后替换一下shader里面的公式即可。
在这里插入图片描述
我们观察线性雾的公式,其中d是我们不知道的,也就是世界坐标的高度值,这就意味着我们想要实现全局雾效的效果就必须要获得世界坐标,获得世界坐标的办法在运动模糊里面通过世界投影矩阵矩阵已经实现过了,但是之前的那种办法需要在shader里面进行两次矩阵的乘法运算,很影响算法的效率,在这里,我们使用另外一种方法来获取世界坐标。
我们将摄像机与屏幕上某一点连线,获得一个方向向量,然后把这个方向向量
深度值+摄像机的位置就是世界坐标了,直观上也很容易理解。
float4 worldPos = _WorldSpaceCameraPos + linearDepth * interpolatedRay;
上面公式中,只有interpolatedRay是未知的,这里我们简单的推导一下interpolatedRay是怎么来的。
interpolatedRay来自于对近裁剪面四个顶点与摄像机形成的方向向量的差值。首先我们需要获得摄像机和近裁剪面的四个顶点的连线向量。
在这里插入图片描述
halfHeight是近裁剪面高度的一半,toTop则是方向朝上,大小为halfHeight的向量,toRight则是方向朝右,大小为近裁剪面宽度一半的向量。
在这里插入图片描述
在这里插入图片描述
上面则是我们需要的四个方向向量的值,理解起来也很容易,就是单纯的向量加减运算。
此外,还需要注意一点,深度纹理获得的深度值是z的值,而不是沿着这四个方向的深度值,我们需要的深度值是下面?的那个值,那才是真正的深度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值