Fixed atmosphere model producing artifacts below ground surface
This commit is contained in:
parent
0ab1719d25
commit
f2d38f7165
3 changed files with 7 additions and 4 deletions
|
@ -255,7 +255,7 @@ static void testAtmosphereBruneton() {
|
||||||
return result.final;
|
return result.final;
|
||||||
} else {
|
} else {
|
||||||
auto result = renderer->getAtmosphereRenderer()->applyAerialPerspective(
|
auto result = renderer->getAtmosphereRenderer()->applyAerialPerspective(
|
||||||
Vector3(-relx * 400.0, (rely + 1.0) * 20.0 - 10.0, 0.0), COLOR_BLACK);
|
Vector3(-relx * 400.0, (rely + 1.0) * 20.0, 0.0), COLOR_BLACK);
|
||||||
return result.final;
|
return result.final;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -246,7 +246,8 @@ vec3 applyWeatherEffects(float distance, vec3 base, vec3 _attenuation, vec3 _ins
|
||||||
|
|
||||||
vec4 applyAerialPerspective(vec4 base)
|
vec4 applyAerialPerspective(vec4 base)
|
||||||
{
|
{
|
||||||
vec3 x = vec3(0.0, Rg + WORKAROUND_OFFSET + cameraLocation.y * WORLD_SCALING, 0.0);
|
vec3 location = vec3(unprojected.x, max(unprojected.y, 0.0), unprojected.z);
|
||||||
|
vec3 x = vec3(0.0, Rg + WORKAROUND_OFFSET + max(cameraLocation.y, 0.0) * WORLD_SCALING, 0.0);
|
||||||
vec3 v = normalize(unprojected - cameraLocation);
|
vec3 v = normalize(unprojected - cameraLocation);
|
||||||
vec3 s = normalize(sunDirection * SUN_DISTANCE_SCALED - x);
|
vec3 s = normalize(sunDirection * SUN_DISTANCE_SCALED - x);
|
||||||
|
|
||||||
|
@ -285,7 +286,7 @@ vec4 getSkyColor(vec3 location, vec3 direction)
|
||||||
|
|
||||||
vec4 applyLighting(vec3 location, vec3 normal, vec4 color, float reflection, float shininess, float hardness)
|
vec4 applyLighting(vec3 location, vec3 normal, vec4 color, float reflection, float shininess, float hardness)
|
||||||
{
|
{
|
||||||
float r0 = Rg + WORKAROUND_OFFSET + location.y * WORLD_SCALING;
|
float r0 = Rg + WORKAROUND_OFFSET + max(location.y, 0.0) * WORLD_SCALING;
|
||||||
vec3 sun_position = sunDirection * SUN_DISTANCE;
|
vec3 sun_position = sunDirection * SUN_DISTANCE;
|
||||||
float muS = dot(vec3(0.0, 1.0, 0.0), normalize(sun_position - vec3(0.0, r0, 0.0)));
|
float muS = dot(vec3(0.0, 1.0, 0.0), normalize(sun_position - vec3(0.0, r0, 0.0)));
|
||||||
|
|
||||||
|
|
|
@ -1095,6 +1095,8 @@ AtmosphereResult AtmosphereModelBruneton::getSkyColor(Vector3 eye, const Vector3
|
||||||
|
|
||||||
AtmosphereResult AtmosphereModelBruneton::applyAerialPerspective(Vector3 location, const Color &base) {
|
AtmosphereResult AtmosphereModelBruneton::applyAerialPerspective(Vector3 location, const Color &base) {
|
||||||
Vector3 eye = parent->getCameraLocation(location);
|
Vector3 eye = parent->getCameraLocation(location);
|
||||||
|
eye.y = max(eye.y, 0.0);
|
||||||
|
location.y = max(location.y, 0.0);
|
||||||
Vector3 sun_position = parent->getAtmosphereRenderer()->getSunDirection().scale(SUN_DISTANCE);
|
Vector3 sun_position = parent->getAtmosphereRenderer()->getSunDirection().scale(SUN_DISTANCE);
|
||||||
|
|
||||||
Vector3 direction = location.sub(eye).scale(WORLD_SCALING);
|
Vector3 direction = location.sub(eye).scale(WORLD_SCALING);
|
||||||
|
@ -1134,7 +1136,7 @@ bool AtmosphereModelBruneton::getLightsAt(vector<LightComponent> &result, const
|
||||||
LightComponent sun, irradiance;
|
LightComponent sun, irradiance;
|
||||||
double muS;
|
double muS;
|
||||||
|
|
||||||
double altitude = location.y * WORLD_SCALING;
|
double altitude = max(location.y * WORLD_SCALING, 0.0);
|
||||||
|
|
||||||
double r0 = Rg + WORKAROUND_OFFSET + altitude;
|
double r0 = Rg + WORKAROUND_OFFSET + altitude;
|
||||||
Vector3 up = {0.0, 1.0, 0.0};
|
Vector3 up = {0.0, 1.0, 0.0};
|
||||||
|
|
Loading…
Reference in a new issue