Unity Shader:雾的数学运算以及在Unity中使用Global Fog
Forward,MSAA,Bloom,Global Fog/Exponential Squared/Density 0
Forward,MSAA,Bloom,Global Fog/Exponential Squared/Density 0.045
Forward,MSAA,Bloom,Global Fog/Exponential Squared/Density 0.085
Forward,MSAA,Bloom,Global Fog/Exponential Squared/Density 0.125
1,雾的数学运算
雾中存在着雾粒子,当光线接近雾粒子时,有一定几率被雾粒子吸收并被散射至其他方向,在此过程中光的初始颜色将会递减,并递增雾粒子的颜色,此种大面积的散色最终产生了雾中朦胧的效果。
左侧光线的原始颜色称为Color-enter, Center,右侧最终变化后的颜色称为Color-leave,Cleave。每当Center接触一个雾粒子时,它的颜色发生如下变化:
当发生多次散射时:
Cleave=(Center-Creduction+Cincrease)-Creduction+Cincrease
由之前公式可总结出:…-Creduction+Cincrease=…*g+(1-g)*Cfog
因此
可归纳为:
如果将Cleave理解为最终可视颜色,Center为物体本身颜色,那么:
一个幂函数可以指数函数重写:
因此
此即为模拟‘均匀雾’的最终公式,exp_2(-(-log_2(g))*z))称为雾的因子f,-log_2(g)称为雾的浓度d,z称为雾的距离z。d取反后保证了公式正确逻辑,既当d增加时f将会衰减,也既是Center衰减,Cfog增加。
2,雾在Unity中的应用(Global Fog)
在以个充满雾的环境中,一个无限远的天空是无法被看见的,既是
plane的材质用default即可,如有特殊需要也可使用其他,但shader必须在片段着色器内使用UNITY_APPLY_FOG函数。
将平行光颜色改为Cfog颜色。
进入windows/lighting/settings;找到Other Settings,勾选“Fog”,Mode改为”Exponential Squared”。
Main Camera增加Global Fog脚本。
在任意脚本中动态增减RenderSettings.fogDensity。
效果:
引用:
1,Cg Tutorial-Nvidia
2,Production Rendering: Design and Implementation-9.6 Fast Power, Log2 and Exp2 functions
https://books.google.com/books?id=BCC5aTR34C4C&pg=PA270#v=onepage&q&f=false
————————————————————————————
维护日志:
2017-8-22:更改了标题
2017-9-22:在文章起始处增加了4张效果图