From 2cd09de2fad20633d7758724fbff1fd9dd939c51 Mon Sep 17 00:00:00 2001 From: Malin E Date: Mon, 14 Nov 2022 10:27:20 +0100 Subject: [PATCH] Fix support for transparent models --- ext/ghoul | 2 +- modules/base/rendering/renderablemodel.cpp | 4 +++- modules/base/rendering/renderablemodel.h | 3 +++ modules/base/shaders/modelOpacity_fs.glsl | 2 +- modules/base/shaders/model_fs.glsl | 18 +++++++++--------- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index df84293686..538b0aef98 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit df84293686f270d40be22725e6b11a4e020b8bf3 +Subproject commit 538b0aef98a62705bf9b83d4299ce11a85d0be64 diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index 20601d884d..67333f808f 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -497,6 +497,8 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) _enableOpacityBlending = p.enableOpacityBlending.value_or(_enableOpacityBlending); addProperty(_enableOpacityBlending); + + _originalRenderBin = renderBin(); } bool RenderableModel::isReady() const { @@ -794,7 +796,7 @@ void RenderableModel::render(const RenderData& data, RendererTasks&) { setRenderBin(Renderable::RenderBin::PostDeferredTransparent); } else { - setRenderBin(Renderable::RenderBin::Opaque); + setRenderBin(_originalRenderBin); } _geometry->render(*_program); diff --git a/modules/base/rendering/renderablemodel.h b/modules/base/rendering/renderablemodel.h index 88604f2fb6..9c193c05f8 100644 --- a/modules/base/rendering/renderablemodel.h +++ b/modules/base/rendering/renderablemodel.h @@ -126,6 +126,9 @@ private: ghoul::opengl::ProgramObject* _quadProgram = nullptr; UniformCache(opacity, opacityBlending, colorTexture, depthTexture, positionTexture, normalTexture) _uniformOpacityCache; + + // Store the original RenderBin + Renderable::RenderBin _originalRenderBin; }; } // namespace openspace diff --git a/modules/base/shaders/modelOpacity_fs.glsl b/modules/base/shaders/modelOpacity_fs.glsl index 2b147b0921..e5af586447 100644 --- a/modules/base/shaders/modelOpacity_fs.glsl +++ b/modules/base/shaders/modelOpacity_fs.glsl @@ -49,7 +49,7 @@ Fragment getFragment() { frag.color.a = opacity * max(max(frag.color.r, frag.color.g), frag.color.b); } else { - frag.color.a = opacity; + frag.color.a = opacity * textureColor.a; } frag.depth = denormalizeFloat(texture(depthTexture, vs_st).x); diff --git a/modules/base/shaders/model_fs.glsl b/modules/base/shaders/model_fs.glsl index 1cd48498b9..b01219f0b6 100644 --- a/modules/base/shaders/model_fs.glsl +++ b/modules/base/shaders/model_fs.glsl @@ -42,8 +42,8 @@ uniform bool has_color_specular; uniform sampler2D texture_diffuse; uniform sampler2D texture_normal; uniform sampler2D texture_specular; -uniform vec3 color_diffuse; -uniform vec3 color_specular; +uniform vec4 color_diffuse; +uniform vec4 color_specular; uniform int nLightSources; uniform vec3 lightDirectionsViewSpace[8]; uniform float lightIntensities[8]; @@ -70,9 +70,9 @@ Fragment getFragment() { return frag; } - vec3 diffuseAlbedo; + vec4 diffuseAlbedo; if (has_texture_diffuse) { - diffuseAlbedo = texture(texture_diffuse, vs_st).rgb; + diffuseAlbedo = texture(texture_diffuse, vs_st); } else { diffuseAlbedo = color_diffuse; @@ -87,7 +87,7 @@ Fragment getFragment() { } else { if (has_color_specular) { - specularAlbedo = color_specular; + specularAlbedo = color_specular.rgb ; } else { specularAlbedo = vec3(1.0); @@ -110,7 +110,7 @@ Fragment getFragment() { vec3 c = normalize(vs_positionCameraSpace.xyz); - vec3 color = ambientIntensity * lightColorAmbient * diffuseAlbedo; + vec3 color = ambientIntensity * lightColorAmbient * diffuseAlbedo.rgb; for (int i = 0; i < nLightSources; ++i) { vec3 l = lightDirectionsViewSpace[i]; @@ -121,7 +121,7 @@ Fragment getFragment() { const float specularPower = 100.0; vec3 diffuseColor = - diffuseIntensity * lightColor * diffuseAlbedo * max(diffuseCosineFactor, 0); + diffuseIntensity * lightColor * diffuseAlbedo.rgb * max(diffuseCosineFactor, 0); vec3 specularColor = specularIntensity * lightColor * specularAlbedo * @@ -132,10 +132,10 @@ Fragment getFragment() { frag.color.rgb = color; } else { - frag.color.rgb = diffuseAlbedo; + frag.color.rgb = diffuseAlbedo.rgb; } - frag.color.a = 1.0; + frag.color.a = diffuseAlbedo.a; frag.depth = vs_screenSpaceDepth; frag.gPosition = vs_positionCameraSpace; frag.gNormal = vec4(vs_normalViewSpace, 0.0);