From c21752f93be28acdfc601ea3b3e9db3cebd18f75 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Wed, 17 Feb 2021 21:31:42 -0500 Subject: [PATCH] Fixed the forward/backward scattering effects. --- .../shaders/advanced_rings_fs.glsl | 5 +++-- modules/globebrowsing/src/ringscomponent.cpp | 19 +++++++++++++++---- modules/globebrowsing/src/ringscomponent.h | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/modules/globebrowsing/shaders/advanced_rings_fs.glsl b/modules/globebrowsing/shaders/advanced_rings_fs.glsl index 9219fa66b1..d3b7f96fe3 100644 --- a/modules/globebrowsing/shaders/advanced_rings_fs.glsl +++ b/modules/globebrowsing/shaders/advanced_rings_fs.glsl @@ -43,6 +43,7 @@ uniform vec2 textureOffset; uniform float colorFilterValue; uniform vec3 sunPosition; +uniform vec3 sunPositionObj; uniform vec3 camPositionObj; uniform float _nightFactor; uniform float zFightingPercentage; @@ -73,11 +74,11 @@ Fragment getFragment() { } vec4 colorBckwrd = texture(ringTextureBckwrd, texCoord); - vec4 colorFwrd = texture(ringTextureFwrd, texCoord); + vec4 colorFwrd = vec4(0.8, 0.8, 0.8, 1.0) * texture(ringTextureFwrd, texCoord); vec4 colorMult = texture(ringTextureColor, texCoord); vec4 transparency = texture(ringTextureTransparency, texCoord); - float lerpFactor = (1.f + dot(camPositionObj.xyz, sunPosition.xyz)) * 0.5f; + float lerpFactor = dot(camPositionObj, sunPositionObj); // Jon Colors: //vec4 diffuse = mix(colorFwrd * vec4(1, 0.88, 0.82, 1.0), colorBckwrd * vec4(1, 0.88, 0.82, 1.0), lerpFactor); diff --git a/modules/globebrowsing/src/ringscomponent.cpp b/modules/globebrowsing/src/ringscomponent.cpp index 9a047868fe..c9d11c4483 100644 --- a/modules/globebrowsing/src/ringscomponent.cpp +++ b/modules/globebrowsing/src/ringscomponent.cpp @@ -59,11 +59,11 @@ namespace { "zFightingPercentage" }; - constexpr const std::array UniformNamesAdvancedRings = { + constexpr const std::array UniformNamesAdvancedRings = { "modelViewProjectionMatrix", "textureOffset", "colorFilterValue", "_nightFactor", - "sunPosition", "camPositionObj", "ringTextureFwrd", "ringTextureBckwrd", - "ringTextureUnlit", "ringTextureColor", "ringTextureTransparency", "shadowMatrix", - "shadowMapTexture", "zFightingPercentage" + "sunPosition", "sunPositionObj", "camPositionObj", "ringTextureFwrd", + "ringTextureBckwrd", "ringTextureUnlit", "ringTextureColor", + "ringTextureTransparency", "shadowMatrix", "shadowMapTexture", "zFightingPercentage" }; constexpr const std::array GeomUniformNames = { @@ -476,6 +476,17 @@ void RingsComponent::draw(const RenderData& data, _shader->setUniform(_uniformCacheAdvancedRings.colorFilterValue, _colorFilter); _shader->setUniform(_uniformCacheAdvancedRings.nightFactor, _nightFactor); _shader->setUniform(_uniformCacheAdvancedRings.sunPosition, _sunPosition); + + const glm::dmat4 inverseModelTransform = glm::inverse(modelTransform); + + glm::vec3 sunPositionObjectSpace = glm::normalize( + glm::vec3(inverseModelTransform * glm::vec4(_sunPosition, 0.0)) + ); + + _shader->setUniform( + _uniformCacheAdvancedRings.sunPositionObj, + sunPositionObjectSpace + ); _shader->setUniform( _uniformCacheAdvancedRings.zFightingPercentage, _zFightingPercentage diff --git a/modules/globebrowsing/src/ringscomponent.h b/modules/globebrowsing/src/ringscomponent.h index b4e3a9cda3..661096d3b7 100644 --- a/modules/globebrowsing/src/ringscomponent.h +++ b/modules/globebrowsing/src/ringscomponent.h @@ -97,7 +97,7 @@ private: sunPosition, ringTexture, shadowMatrix, shadowMapTexture, zFightingPercentage ) _uniformCache; UniformCache(modelViewProjectionMatrix, textureOffset, colorFilterValue, nightFactor, - sunPosition, camPositionObj, ringTextureFwrd, ringTextureBckwrd, + sunPosition, sunPositionObj, camPositionObj, ringTextureFwrd, ringTextureBckwrd, ringTextureUnlit, ringTextureColor, ringTextureTransparency, shadowMatrix, shadowMapTexture, zFightingPercentage ) _uniformCacheAdvancedRings;