mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 19:01:14 +02:00
Moved linearDepthMap into Haze.slf
Refactored computation of keylight attenuation - now function in Haze.slh
This commit is contained in:
parent
803e5d143d
commit
87aee7242a
3 changed files with 47 additions and 47 deletions
|
@ -123,6 +123,9 @@ vec3 evalSkyboxGlobalColor(mat4 invViewMat, float shadowAttenuation, float obscu
|
||||||
color += ambientSpecular;
|
color += ambientSpecular;
|
||||||
|
|
||||||
// Directional
|
// Directional
|
||||||
|
// Get directional light (used by both directional light and haze attenuation)
|
||||||
|
Light directionalLight = getLight();
|
||||||
|
|
||||||
vec3 directionalDiffuse;
|
vec3 directionalDiffuse;
|
||||||
vec3 directionalSpecular;
|
vec3 directionalSpecular;
|
||||||
evalLightingDirectional(directionalDiffuse, directionalSpecular, lightDirection, lightIrradiance, fragEyeDir, fragNormal, roughness, metallic, fresnel, albedo, shadowAttenuation
|
evalLightingDirectional(directionalDiffuse, directionalSpecular, lightDirection, lightIrradiance, fragEyeDir, fragNormal, roughness, metallic, fresnel, albedo, shadowAttenuation
|
||||||
|
@ -135,52 +138,7 @@ vec3 evalSkyboxGlobalColor(mat4 invViewMat, float shadowAttenuation, float obscu
|
||||||
|
|
||||||
// Attenuate the light if haze effect selected
|
// Attenuate the light if haze effect selected
|
||||||
if ((hazeParams.hazeMode & HAZE_MODE_IS_KEYLIGHT_ATTENUATED) == HAZE_MODE_IS_KEYLIGHT_ATTENUATED) {
|
if ((hazeParams.hazeMode & HAZE_MODE_IS_KEYLIGHT_ATTENUATED) == HAZE_MODE_IS_KEYLIGHT_ATTENUATED) {
|
||||||
// Directional light attenuation is simulated by assuming the light source is at a fixed height above the
|
color = computeHazeColor(color, directionalLight, invViewMat, position);
|
||||||
// fragment. This height is where the haze density is reduced by 95% from the haze at the fragment's height
|
|
||||||
//
|
|
||||||
// The distance is computed from the height and the directional light orientation
|
|
||||||
// The distance is limited to height * 1,000, which gives an angle of ~0.057 degrees
|
|
||||||
|
|
||||||
// Get directional light
|
|
||||||
Light light = getLight();
|
|
||||||
vec3 lightDirection = getLightDirection(light);
|
|
||||||
|
|
||||||
// Height at which haze density is reduced by 95% (default set to 2000.0 for safety ,this should never happen)
|
|
||||||
float height_95p = 2000.0;
|
|
||||||
if (hazeParams.hazeKeyLightAltitudeFactor > 0.0f) {
|
|
||||||
height_95p = -log(0.05) / hazeParams.hazeKeyLightAltitudeFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note that the sine will always be positive
|
|
||||||
float sin_pitch = sqrt(1.0 - lightDirection.y * lightDirection.y);
|
|
||||||
|
|
||||||
float distance;
|
|
||||||
const float minimumSinPitch = 0.001;
|
|
||||||
if (sin_pitch < minimumSinPitch) {
|
|
||||||
distance = height_95p / minimumSinPitch;
|
|
||||||
} else {
|
|
||||||
distance = height_95p / sin_pitch;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Position of fragment in world coordinates
|
|
||||||
vec4 worldFragPos = invViewMat * vec4(position, 0.0);
|
|
||||||
|
|
||||||
// Integration is from the fragment towards the light source
|
|
||||||
// Note that the haze base reference affects only the haze density as function of altitude
|
|
||||||
float hazeDensityDistribution =
|
|
||||||
hazeParams.hazeKeyLightRangeFactor *
|
|
||||||
exp(-hazeParams.hazeKeyLightAltitudeFactor * (worldFragPos.y - hazeParams.hazeBaseReference));
|
|
||||||
|
|
||||||
float hazeIntegral = hazeDensityDistribution * distance;
|
|
||||||
|
|
||||||
// Note that t is constant and equal to -log(0.05)
|
|
||||||
// float t = hazeParams.hazeAltitudeFactor * height_95p;
|
|
||||||
// hazeIntegral *= (1.0 - exp (-t)) / t;
|
|
||||||
hazeIntegral *= 0.3171178;
|
|
||||||
|
|
||||||
float hazeAmount = 1.0 - exp(-hazeIntegral);
|
|
||||||
|
|
||||||
color = mix(color, vec3(0.0, 0.0, 0.0), hazeAmount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return color;
|
return color;
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
<@include Haze.slh@>
|
<@include Haze.slh@>
|
||||||
|
|
||||||
uniform sampler2D colorMap;
|
uniform sampler2D colorMap;
|
||||||
|
uniform sampler2D linearDepthMap;
|
||||||
|
|
||||||
vec4 unpackPositionFromZeye(vec2 texcoord) {
|
vec4 unpackPositionFromZeye(vec2 texcoord) {
|
||||||
float Zeye = -texture(linearDepthMap, texcoord).x;
|
float Zeye = -texture(linearDepthMap, texcoord).x;
|
||||||
|
|
|
@ -40,7 +40,48 @@ layout(std140) uniform hazeBuffer {
|
||||||
HazeParams hazeParams;
|
HazeParams hazeParams;
|
||||||
};
|
};
|
||||||
|
|
||||||
uniform sampler2D linearDepthMap;
|
vec3 computeHazeColor(vec3 color, Light directionalLight, mat4 invViewMat, vec3 worldFragPos) {
|
||||||
|
// Directional light attenuation is simulated by assuming the light source is at a fixed height above the
|
||||||
|
// fragment. This height is where the haze density is reduced by 95% from the haze at the fragment's height
|
||||||
|
//
|
||||||
|
// The distance is computed from the height and the directional light orientation
|
||||||
|
// The distance is limited to height * 1,000, which gives an angle of ~0.057 degrees
|
||||||
|
vec3 lightDirection = getLightDirection(directionalLight);
|
||||||
|
|
||||||
|
// Height at which haze density is reduced by 95% (default set to 2000.0 for safety ,this should never happen)
|
||||||
|
float height_95p = 2000.0;
|
||||||
|
const float log_p_005 = log(0.05);
|
||||||
|
if (hazeParams.hazeKeyLightAltitudeFactor > 0.0f) {
|
||||||
|
height_95p = -log_p_005 / hazeParams.hazeKeyLightAltitudeFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note that we need the sine to be positive
|
||||||
|
float sin_pitch = abs(lightDirection.y);
|
||||||
|
|
||||||
|
float distance;
|
||||||
|
const float minimumSinPitch = 0.001;
|
||||||
|
if (sin_pitch < minimumSinPitch) {
|
||||||
|
distance = height_95p / minimumSinPitch;
|
||||||
|
} else {
|
||||||
|
distance = height_95p / sin_pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Integration is from the fragment towards the light source
|
||||||
|
// Note that the haze base reference affects only the haze density as function of altitude
|
||||||
|
float hazeDensityDistribution =
|
||||||
|
hazeParams.hazeKeyLightRangeFactor *
|
||||||
|
exp(-hazeParams.hazeKeyLightAltitudeFactor * (worldFragPos.y - hazeParams.hazeBaseReference));
|
||||||
|
|
||||||
|
float hazeIntegral = hazeDensityDistribution * distance;
|
||||||
|
|
||||||
|
// Note that t is constant and equal to -log(0.05)
|
||||||
|
// float t = hazeParams.hazeAltitudeFactor * height_95p;
|
||||||
|
// hazeIntegral *= (1.0 - exp (-t)) / t;
|
||||||
|
hazeIntegral *= 0.3171178;
|
||||||
|
|
||||||
|
float hazeAmount = 1.0 - exp(-hazeIntegral);
|
||||||
|
|
||||||
|
return mix(color, vec3(0.0, 0.0, 0.0), hazeAmount);
|
||||||
|
}
|
||||||
<@endif@>
|
<@endif@>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue