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

雾的计算原理其实很简单
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的值,而不是沿着这四个方向的深度值,我们需要的深度值是下面?的那个值,那才是真正的深度。
在这里插入图片描述由相似三角形也能推导出来

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值