这个其实就是God Ray的一种实现,即提取图中亮度大的部分,做径向模糊,然后叠加在原图上。有一篇讲的很不错的God Ray的文章中有提到这个方法,其中的图很直观。https://blog.csdn.net/puppet_master/article/details/79859678。
用他这张图,结合Unity的Sun Shafts,跑了下类似的效果,还是比较好看的。
原图:
GodRay:
不过这个感觉光的颜色不太对劲,换了个颜色就挺不错的了:
另外,参考了另一个人的博客,搞了一个类似于丁达尔效应或者体积雾的效果(博客地址:https://zhuanlan.zhihu.com/p/186270029):
不过因为博客园似乎无法上传视频,只能作罢了,不过本来这种情况下出现雾也就不太符合自然情况。
关于源码部分,frag分为使用深度图和不使用深度图的。
先看一下一个公共函数:
这个函数根据传入的值,如果把超出亮度阈值的部分转化成一个half返回,由于rgb相同的一定是灰色,所以这就是注释中说的greyscale的含义;从这里可以知道shader中有提取高亮度的部分,并受到参数控制。
对于使用深度的部分,代码如下:
可以很明显的看到只有深度很远的才会被采样,所以相机里面直接放一张图也是可以后处理的。
对于不使用深度部分,代码如下:
其中的Luminance函数式用来计算一个颜色的灰度值的,也就是说,代码比较了天空和该点颜色差值的灰度值,如果过小,就使用天空盒的颜色进行转换,说实话,这里没有看的太懂,实际上,场景跑起来的效果也是怪怪的= =。
总而言之,这个提取高亮部分做径向模糊的思路还是比较惊艳的,不过Unity源码本身没有看的太明白。。