求知若饥,虚心若愚
来源仓库:https://github.com/Reguluz/HeightExponentialFog
讲解PPT:https://docs.qq.com/slide/DUWJ0dk55WndHTXhQ
核心代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| // 思路:顶点+指数雾(考虑高度和深度,同时还有灯光的散射) half heightFallOff = _FogFallOff * 0.01; // 雾散强度 = 全局雾散系数 * 相机高度-目标位置高度-雾变化高度范围相对摄像机的高度差 half falloff = heightFallOff * ( posWorld.y - _WorldSpaceCameraPos.y- _FogHeight); // 雾密度 = 全局密度 * 2^相机高度-目标位置高度-雾变化高度范围相对摄像机的高度差 half fogDensity = _FogGlobalDensity * exp2(-falloff); // 该拟合公式来自UE4 // 指数雾强度 = (1 - 2^-雾散强度) / 雾散强度 half fogFactor = (1 - exp2(-falloff))/falloff; half3 viewDir = _WorldSpaceCameraPos - posWorld; half rayLength = length(viewDir); // 距离强度 = (视线距离 - 起始距离)/ 距离变化系数 half distanceFactor = max((rayLength - _FogStartDis)/ _FogGradientDis, 0); half fog = fogFactor * fogDensity * distanceFactor; // 散射强度 = (归一化视线向量的反方向 与 入射光方向 的夹角)^指数衰减系数 half inscatterFactor = pow(saturate(dot(-normalize(viewDir), WorldSpaceLightDir(half4(posWorld,1)))), _FogInscatteringExp); // 散射同样受距离影响,需要衰减 inscatterFactor *= 1-saturate(exp2(falloff)); inscatterFactor *= distanceFactor; // 根据散射强度混合雾和灯光颜色 half3 finalFogColor = lerp(_FogColor, _LightColor0, saturate(inscatterFactor)); // 混合雾的颜色到输出颜色中 return lerp(col, finalFogColor, saturate(fog));
|
值得一提的是仓库中将这段代码封装成头文件调用(由于顶点雾几乎要修改所有shader),而且还使用了一个脚本将雾效相关的参数全局统一传入。具体可以查阅仓库中Fog.cs