MetaCore/build_filament/shaders/minified/surface_fog.fs

71 lines
2.7 KiB
GLSL

#if MATERIAL_FEATURE_LEVEL > 0
vec4 fog(highp vec3 view, const mediump samplerCube fogColorTexture) {
highp float d = length(view);
if (d < frameUniforms.fogStart) {
return vec4(0);
}
if (d > frameUniforms.fogCutOffDistance) {
return vec4(0);
}
highp vec3 density = frameUniforms.fogDensity;
highp float falloff = frameUniforms.fogHeightFalloff;
highp float fogOpticalPathAtOneMeter = density.z;
highp float fh = falloff * view.y;
if (abs(fh) > 0.00125) {
fogOpticalPathAtOneMeter = (density.z - density.x * exp(density.y - fh)) / fh;
}
highp float fogOpticalPath = fogOpticalPathAtOneMeter * max(d - frameUniforms.fogStart, 0.0);
float fogTransmittance = exp(-fogOpticalPath);
float fogOpacity = min(1.0 - fogTransmittance, frameUniforms.fogMaxOpacity);
vec3 fogColor = frameUniforms.fogColor;
#if MATERIAL_FEATURE_LEVEL > 0
if (frameUniforms.fogColorFromIbl > 0.0) {
float normalizedDepth = d * frameUniforms.fogOneOverFarMinusNear - frameUniforms.fogNearOverFarMinusNear;
lowp vec2 minMaxMip = unpackHalf2x16(frameUniforms.fogMinMaxMip);
lowp float lod = mix(minMaxMip.y, minMaxMip.x, saturate(normalizedDepth));
highp mat3 worldFromUserWorldMatrix = transpose(mat3(frameUniforms.userWorldFromWorldMatrix));
fogColor *= textureLod(fogColorTexture, worldFromUserWorldMatrix * view, lod).rgb;
}
#endif
fogColor *= frameUniforms.iblLuminance * fogOpacity;
if (frameUniforms.fogInscatteringSize > 0.0) {
highp float sunOpticalPath =
fogOpticalPathAtOneMeter * max(d - frameUniforms.fogInscatteringStart, 0.0);
float sunTransmittance = exp(-sunOpticalPath);
vec3 sunColor = frameUniforms.lightColorIntensity.rgb * frameUniforms.lightColorIntensity.w;
float sunAmount = max(dot(normalize(view), frameUniforms.lightDirection), 0.0);
float sunInscattering = pow(sunAmount, frameUniforms.fogInscatteringSize);
fogColor += sunColor * (sunInscattering * (1.0 - sunTransmittance));
}
return vec4(fogColor, fogOpacity);
}
#endif
vec4 fogLinear(highp vec3 view
#if MATERIAL_FEATURE_LEVEL > 0
, const mediump samplerCube fogColorTexture
#endif
)
{
highp float d = length(view);
if (d < frameUniforms.fogStart) {
return vec4(0);
}
if (d > frameUniforms.fogCutOffDistance) {
return vec4(0);
}
highp float A = frameUniforms.fogLinearParams.x;
highp float B = frameUniforms.fogLinearParams.y;
float fogOpacity = saturate(A * d + B);
vec3 fogColor = frameUniforms.fogColor;
#if MATERIAL_FEATURE_LEVEL > 0
if (frameUniforms.fogColorFromIbl > 0.0) {
lowp vec2 minMaxMip = unpackHalf2x16(frameUniforms.fogMinMaxMip);
highp mat3 worldFromUserWorldMatrix = transpose(mat3(frameUniforms.userWorldFromWorldMatrix));
fogColor *= textureLod(fogColorTexture, worldFromUserWorldMatrix * view, minMaxMip.x).rgb;
}
#endif
fogColor *= frameUniforms.iblLuminance * fogOpacity;
return vec4(fogColor, fogOpacity);
}