I have a custom lighting material that adds fog. In almost every discussion about fog it is mentioned that fog is best implemented in the material/shader as opposed to the post processor. I don’t mind implementing this into the default lighting shader (with ifdef preprocessors so it doesnt affect performance if you don’t “enable” fog).
There’s a cheap, medium and expensive version so it suits all cases (low-end/android, etc).
Is there any opposition in doing so?
// @see: http://in2gpu.com/2014/07/22/create-fog-shader/
// @see: https://hub.jmonkeyengine.org/t/fog-glsl-library-for-materials/40943
// Float FogDensity: 0.05
// Float FogDensity: 0.003
// Float FogStart = 20.0
// Float FogEnd = 80.0
// .vert: varying float dist;
// .vert: dist = distance(g_CameraPosition, (g_WorldMatrix * modelSpacePos).xyz);
// pick one...
// .frag: vec4 fogResult = getFogLinear(gl_FragColor, fogColor, start, end, dist);
// .frag: vec4 fogResult = getFogExp(gl_FragColor, fogColor, m_FogDensity, dist);
// .frag: vec4 fogResult = getFogExpSquare(gl_FragColor, fogColor, m_FogDensity, dist);
vec4 getFogLinear(in vec4 diffuseColor, in vec4 fogColor, in float start, in float end, in float distance) {
float fogFactor = (end - distance) / (end - start);
fogFactor = clamp(fogFactor, 0.0, 1.0);
return mix(fogColor, diffuseColor, fogFactor);
}
vec4 getFogExp(in vec4 diffuseColor, in vec4 fogColor, in float fogDensity, in float distance) {
float fogFactor = 1.0 / exp(distance * fogDensity);
fogFactor = clamp( fogFactor, 0.0, 1.0 );
return mix(fogColor, diffuseColor, fogFactor);
}
vec4 getFogExpSquare(in vec4 diffuseColor, in vec4 fogColor, in float fogDensity, in float distance) {
float fogFactor = 1.0 / exp( (distance * fogDensity) * (distance * fogDensity));
fogFactor = clamp( fogFactor, 0.0, 1.0 );
vec4 finalColor = mix(fogColor, diffuseColor, fogFactor);
return finalColor;
}