dynamic sky atmosphere updates

This commit is contained in:
turanszkij
2019-09-11 23:48:26 +01:00
parent 485b7588b2
commit 92a32c15f7
4 changed files with 18 additions and 23 deletions
+16 -21
View File
@@ -25,38 +25,35 @@ float noise(in float2 p)
return dot(n, float3(70.0, 70.0, 70.0));
}
//#define SIMPLE_SKY
float3 GetDynamicSkyColor(in float3 normal, bool sun_enabled = true, bool clouds_enabled = true, bool dark_enabled = false)
// Returns sky color modulated by the sun and clouds
// V : view direction
float3 GetDynamicSkyColor(in float3 V, bool sun_enabled = true, bool clouds_enabled = true, bool dark_enabled = false)
{
#ifdef SIMPLE_SKY
const float aboveHorizon = saturate(pow(saturate(normal.y), 0.3f + g_xFrame_Fog.z) / (g_xFrame_Fog.z + 1));
const float3 sky = lerp(GetHorizonColor(), GetZenithColor(), smoothstep(0, 1, aboveHorizon));
#else
const float3 skyColor = GetZenithColor();
const float3 sunDirection = GetSunDirection();
const float3 sunColor = GetSunColor();
sun_enabled = sun_enabled && any(sunColor);
const float zenith = normal.y; // how much is above (0: horizon, 1: directly above)
const float zenith = V.y; // how much is above (0: horizon, 1: directly above)
const float sunScatter = saturate(sunDirection.y + 0.1f); // how much the sun is directly above. Even if sunis at horizon, we add a constant scattering amount so that light still scatters at horizon
const float atmosphereDensity = 0.7f; // constant of air density (bigger is more obstruction of sun)
const float atmosphereDensity = 0.5 + g_xFrame_Fog.z; // constant of air density, or "fog height" as interpreted here (bigger is more obstruction of sun)
const float zenithDensity = atmosphereDensity / pow(max(0.000001f, zenith), 0.75f);
const float sunScatterDensity = atmosphereDensity / pow(max(0.000001f, sunScatter), 0.75f);
const float3 skyAbsorption = exp2(skyColor * -zenithDensity) * 2.0f; // gradient on horizon
const float3 sunAbsorption = sunColor * exp2(skyColor * -sunScatterDensity) * 2.0f; // gradient of sun when it's getting below horizon
const float3 aberration = float3(0.39, 0.57, 1.0); // the chromatic aberration effect on the horizon-zenith fade line
const float3 skyAbsorption = saturate(exp2(aberration * -zenithDensity) * 2.0f); // gradient on horizon
const float3 sunAbsorption = sun_enabled ? saturate(sunColor * exp2(aberration * -sunScatterDensity) * 2.0f) : 1; // gradient of sun when it's getting below horizon
const float sunAmount = distance(normal, sunDirection); // sun falloff descreasing from mid point
const float rayleigh = 1.0 + pow(1.0 - saturate(sunAmount), 2.0) * PI * 0.5;
const float sunAmount = distance(V, sunDirection); // sun falloff descreasing from mid point
const float rayleigh = sun_enabled ? 1.0 + pow(1.0 - saturate(sunAmount), 2.0) * PI * 0.5 : 1;
const float mie_disk = saturate(1.0 - pow(sunAmount, 0.1));
const float3 mie = mie_disk * mie_disk*(3.0 - 2.0 * mie_disk) * 2.0 * PI * sunAbsorption;
const float3 sun = smoothstep(0.03, 0.026, sunAmount) * 50.0 * skyAbsorption; // sun disc
const float3 horizon = GetHorizonColor() * saturate(1 - skyAbsorption); // horizon color will affect when zenith density decreases
const float3 sun = smoothstep(0.03, 0.026, sunAmount) * sunColor * 50.0 * skyAbsorption; // sun disc
float3 sky = skyColor * zenithDensity * rayleigh;
sky = lerp(sky * skyAbsorption, sky / (sky + 0.5), sunScatter); // when sun goes below horizon, absorb sky color
sky += horizon; // tint horizon color
float3 sky = lerp(GetHorizonColor(), GetZenithColor() * zenithDensity * rayleigh, skyAbsorption);
sky = lerp(sky * skyAbsorption, sky, sunScatter); // when sun goes below horizon, absorb sky color
if (sun_enabled)
{
sky += sun;
@@ -67,7 +64,7 @@ float3 GetDynamicSkyColor(in float3 normal, bool sun_enabled = true, bool clouds
if (dark_enabled)
{
sky = max(pow(saturate(dot(GetSunDirection().xyz, normal)), 64)*GetSunColor().rgb, 0) * skyAbsorption;
sky = max(pow(saturate(dot(GetSunDirection().xyz, V)), 64) * sunColor, 0) * skyAbsorption;
}
if (clouds_enabled)
@@ -79,7 +76,7 @@ float3 GetDynamicSkyColor(in float3 normal, bool sun_enabled = true, bool clouds
// Trace a cloud layer plane:
const float3 o = g_xCamera_CamPos;
const float3 d = normal;
const float3 d = V;
const float3 planeOrigin = float3(0, 1000, 0);
const float3 planeNormal = float3(0, -1, 0);
const float t = Trace_plane(o, d, planeOrigin, planeNormal);
@@ -157,8 +154,6 @@ float3 GetDynamicSkyColor(in float3 normal, bool sun_enabled = true, bool clouds
}
}
#endif // SIMPLE_SKY
return sky;
}
+1 -1
View File
@@ -3550,7 +3550,7 @@ void UpdatePerFrameData(float dt, uint32_t layerMask)
{
renderTime_Prev = renderTime;
deltaTime = dt * GetGameSpeed();
renderTime += dt;
renderTime += deltaTime;
GraphicsDevice* device = GetDevice();
Scene& scene = GetScene();
+1 -1
View File
@@ -906,7 +906,7 @@ namespace wiSceneSystem
};
uint32_t _flags = EMPTY;
XMFLOAT3 sunColor = XMFLOAT3(1, 1, 1);
XMFLOAT3 sunColor = XMFLOAT3(0, 0, 0);
XMFLOAT3 sunDirection = XMFLOAT3(0, 1, 0);
XMFLOAT3 horizon = XMFLOAT3(0.0f, 0.0f, 0.0f);
XMFLOAT3 zenith = XMFLOAT3(0.0f, 0.0f, 0.0f);
Binary file not shown.