#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); }