有玩过《杀戮地带:暗影坠落》的小伙伴可能会对游戏里的体积光影有很深刻的印象,感觉开发人员在设计画面的时候非常想要突出体积光以及横向的高光,使得游戏画面很有特色。其使用的体积光影之多甚至让我产生了“光污染”的感觉,本文就来简单的实现一下这种朦胧的效果。
刚接触渲染时就被下面这些大佬的实现惊艳到,这里也用到了许多里面的技巧。
CSDN-专业IT技术社区-登录blog.csdn.net
MaxwellGeng:Unity3D实时体积光zhuanlan.zhihu.com
介绍:
光线传播时照射到尘埃或者水汽会产生散射效果,产生雾蒙蒙的感觉。
本文介绍在前向渲染下简单的实现平行光的体积光效果,采用了后处理的方案。
丁达尔效应_百度百科baike.baidu.com
主要思路:
通过光线步进(ray marching)将点/坐标沿着视线前进,每次前进判断该点是否在阴影中,这样经过若干次的前进,我们就能知道当前像素点在看到最终位置时会经过怎样的光影信息,这样就可以对该像素的明暗进行操作,在光或者影上进行操作。
实现:
先预览下开启体积光影的效果,对比如下:
1.采样阴影信息
首先我们需要一个方法来知道某个点是否是处于阴影中,对于平行光的话如果了解unity自带shadowmap的实现就能知道可以通过对比灯光空间的shadowmapTexture深度和该点在灯光空间的深度作比较来获得阴影信息,可以参考以下资料:
Rendering 7catlikecoding.com
需要注意这里阴影级联 (Shadow Cascade)选择了无,注意如果开启了多个的话采样阴影算法需要调整,大家可以自行修改。
下图是输出的是当前像素对应的阴影信息,和直接看到默认的阴影信息一样。之后我们只需每个点都照这样获取阴影信息就行。
2.进行步进
ray marching参考资料如下:
1. Why Ray Marchingwww.jianshu.comfractals, computer graphics, mathematics, sh