diff --git a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp index 46f7dd4cf6..088181189d 100644 --- a/modules/atmosphere/rendering/atmospheredeferredcaster.cpp +++ b/modules/atmosphere/rendering/atmospheredeferredcaster.cpp @@ -258,6 +258,9 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData, program.setUniform("eyeToModel", glm::mat4(eyeToModel)); + float viewScaling = renderData.camera.scaling(); + program.setUniform("viewScaling", viewScaling); + glm::mat4 invProjection = glm::inverse(renderData.camera.projectionMatrix()); program.setUniform("inverseProjection", invProjection); diff --git a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl index aa1e30618e..50578be199 100644 --- a/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl +++ b/modules/atmosphere/shaders/atmosphere_deferred_fs.glsl @@ -77,6 +77,7 @@ uniform int cullAtmosphere; uniform float backgroundConstant; uniform bool firstPaint; uniform float atmExposure; +uniform float viewScaling; uniform sampler2D irradianceTexture; uniform sampler3D inscatterTexture; @@ -253,6 +254,9 @@ void dCalculateRayRenderableGlobe(in int mssaSample, out dRay ray) { vec4 eyeSpaceCoords = inverseProjection * vec4(clipCoords); eyeSpaceCoords.w = 1.0; + // Scale the vector to avoid floating point inaccuracy. + eyeSpaceCoords.xyz *= viewScaling * 1000000.0; + dvec4 objectCoords = eyeToModel * eyeSpaceCoords; // ============================