Fog Volume渲染算法实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/85304124

由于项目需求,需要实现Fog Volume的效果,查阅了网上资料没有找到相关算法介绍,Unity虽然提供了插件但是效果不是项目想要的,只能自己去写,为了便于日后查阅,写篇博客记录下来,在介绍Fog Volume算法实现之前,先介绍Fog Volume可以实现的效果表现,它可以跟blinn phone,阴影结合起来使用,效果更佳,看下面与blinn phone结合实现的效果:

在这里插入图片描述
每种渲染效果的背后都是有算法的支撑,为了实现这种可以应用到角色身上的渲染效果,通过查阅资料找到了算法的实现方式,然后将算法转化成Shader语言实现出来,下面就介绍算法的推导公式。
先从最简单的射线公式说起:
在这里插入图片描述
们这里会用到光的散射,我们假设光散射是均匀的,在此也给读者推荐一本书,《Physically Based Rendering》书中也提供了源代码:地址如下所示:https://github.com/mmp/pbrt-v3
感兴趣的读者可以下载学习。
在《Physically Based Rendering》中的P578页,描述了由于光散射到从View方向而产生亮度变化的微分方程,如果我们假设所有方向的散射相等,公式如下所示:
在这里插入图片描述
是不是感觉很有意思,忽然从线性方程变成了上面的方程,如果不查阅资料真心的想不到。老外还是蛮厉害的,好的渲染算法大部分都是人家先推出的。我们拿过来使用,继续公式的推演,假设从View距离点光源的距离为d,光源强度为I,我们可以计算出接收点的辐射强度为:
在这里插入图片描述
将我们的射线方程带入上式可以得到下面的公式:
在这里插入图片描述
再将上面的公式做微积分可以得到下面的公式:
在这里插入图片描述
s是光源的位置,为了求出上面的微积分,我们需要把分母上的距离计算扩展成更容易处理的形式:
在这里插入图片描述
再展开上述公式如下所示:
在这里插入图片描述
其中m=(p−s),因为方向向量是单位长度我们可以把系数从二次项中去掉,我们有:
在这里插入图片描述
下面将继续简化它,完成我们得到的平方:
在这里插入图片描述
我们用下面的公式替换上面的方程:
在这里插入图片描述代入我们的微积分方程可以得到如下公式:
在这里插入图片描述终于到了最后一步了,最终方程为:
在这里插入图片描述
这样我们的散射函数也就可以根据上面的公式求处,代码如下所示:
在这里插入图片描述
可以在此基础上再增加blinn phone函数就得到了文章开头的图片效果,代码如下所示:
在这里插入图片描述再将上述函数应用到我们的Shader中,如下所示:
在这里插入图片描述
当然,我们还可以加入PCF实时阴影,同样可以实现比较好的效果,如下所示:
在这里插入图片描述
总结
最近一直在研究渲染算法,算法在渲染中占用很重要的地位,作为程序员可以通过算法的应用,来提升自己的编程能力。今天就写到这里,晚安。

猜你喜欢

转载自blog.csdn.net/jxw167/article/details/85304124