mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-11-04 18:49:26 +01:00
Improve skybox
This commit is contained in:
@@ -218,7 +218,10 @@ void CSkyDome::RebuildColors() {
|
|||||||
vertex = glm::normalize( m_vertices[ i ] );
|
vertex = glm::normalize( m_vertices[ i ] );
|
||||||
|
|
||||||
// angle between sun and vertex
|
// angle between sun and vertex
|
||||||
const float gamma = std::acos( glm::dot( vertex, m_sundirection ) );
|
// NOTE: the dot product can exceed the [ -1, 1 ] range by a rounding error,
|
||||||
|
// which would turn the vertex - and, through the averages, the fog and ambient
|
||||||
|
// light - into a NaN, so it gets clamped before feeding it to acos()
|
||||||
|
const float gamma = std::acos( std::clamp( glm::dot( vertex, m_sundirection ), -1.0f, 1.0f ) );
|
||||||
|
|
||||||
// warning : major hack!!! .. i had to do something with values under horizon
|
// warning : major hack!!! .. i had to do something with values under horizon
|
||||||
//vertex.y = Clamp<float>( vertex.y, 0.05f, 1.0f );
|
//vertex.y = Clamp<float>( vertex.y, 0.05f, 1.0f );
|
||||||
|
|||||||
@@ -10,9 +10,26 @@ layout(location = 0) out vec4 out_color;
|
|||||||
layout(location = 1) out vec4 out_motion;
|
layout(location = 1) out vec4 out_motion;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// the skydome vertex colours carry Perez luminance scaled by a fixed exposure
|
||||||
|
// (see CSkyDome::SetExposure), so the circumsolar region and the horizon band
|
||||||
|
// routinely land well above 1.0. hard-clipping them, as this shader used to do,
|
||||||
|
// flattened everything within ~20 degrees of the sun - and most of the lower sky -
|
||||||
|
// into one solid white patch. compress the top end instead: below the knee the
|
||||||
|
// response is unchanged, above it it rolls off towards SKY_SHOULDER_WHITE, so the
|
||||||
|
// brightness gradient around the sun survives and the patch keeps a soft edge.
|
||||||
|
const float SKY_SHOULDER_KNEE = 0.25;
|
||||||
|
const float SKY_SHOULDER_WHITE = 0.95;
|
||||||
|
|
||||||
|
vec3 sky_shoulder(vec3 color)
|
||||||
|
{
|
||||||
|
const float range = SKY_SHOULDER_WHITE - SKY_SHOULDER_KNEE;
|
||||||
|
vec3 excess = max(color - vec3(SKY_SHOULDER_KNEE), vec3(0.0));
|
||||||
|
return min(color, vec3(SKY_SHOULDER_KNEE)) + range * (vec3(1.0) - exp(-excess / range));
|
||||||
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec3 col = clamp(pow(f_color.rgb, vec3(2.2)),0, 1);
|
vec3 col = sky_shoulder(pow(max(f_color.rgb, vec3(0.0)), vec3(2.2)));
|
||||||
#if POSTFX_ENABLED
|
#if POSTFX_ENABLED
|
||||||
out_color = vec4(apply_fog(col), 1.0f);
|
out_color = vec4(apply_fog(col), 1.0f);
|
||||||
#else
|
#else
|
||||||
|
|||||||
Reference in New Issue
Block a user