From aca57fd5f08a2ff429c658a854035cb852cdced0 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 30 Dec 2021 18:45:23 +0100 Subject: [PATCH] fix some transparency issues --- .../bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt | 1 - .../gui/hud/elements/other/CrosshairHUDElement.kt | 2 +- .../de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt | 6 +++--- .../minosoft/gui/rendering/system/base/RenderSystem.kt | 6 ++++-- .../rendering/system/base/phases/TranslucentDrawable.kt | 8 +++++++- .../rendering/system/base/phases/TransparentDrawable.kt | 2 +- .../minosoft/rendering/shader/particle/particle.fsh | 4 ++++ .../assets/minosoft/rendering/shader/world/world.fsh | 4 ++++ 8 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt index 35eb4311f..b4a878324 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDRenderer.kt @@ -153,7 +153,6 @@ class HUDRenderer( private fun setup() { renderWindow.renderSystem.reset(blending = true) - renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER) shader.use() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt index 38dc3b9c9..d74f1e046 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt @@ -51,7 +51,7 @@ class CrosshairHUDElement(hudRenderer: HUDRenderer) : CustomHUDElement(hudRender val mesh = mesh ?: return if (crosshairProfile.complementaryColor) { - renderWindow.renderSystem.reset(blending = true, sourceAlpha = BlendingFunctions.ONE_MINUS_DESTINATION_COLOR, destinationAlpha = BlendingFunctions.ONE_MINUS_SOURCE_COLOR) + renderWindow.renderSystem.reset(blending = true, sourceRGB = BlendingFunctions.ONE_MINUS_DESTINATION_COLOR, destinationRGB = BlendingFunctions.ONE_MINUS_SOURCE_COLOR) } else { renderWindow.renderSystem.reset() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt index 7e5991cdd..42c31bfaa 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt @@ -23,7 +23,7 @@ import de.bixilon.minosoft.gui.rendering.renderer.Renderer import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder import de.bixilon.minosoft.gui.rendering.system.base.* import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer -import de.bixilon.minosoft.gui.rendering.system.base.phases.PostDrawable +import de.bixilon.minosoft.gui.rendering.system.base.phases.PreDrawable import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture import de.bixilon.minosoft.gui.rendering.util.mesh.SimpleTextureMesh import de.bixilon.minosoft.modding.event.events.TimeChangeEvent @@ -37,7 +37,7 @@ import glm_.vec3.Vec3 class SkyRenderer( private val connection: PlayConnection, override val renderWindow: RenderWindow, -) : Renderer, PostDrawable { +) : Renderer, PreDrawable { override val renderSystem: RenderSystem = renderWindow.renderSystem private val skyboxShader = renderSystem.createShader(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "sky/skybox")) private val skySunShader = renderSystem.createShader(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "sky/sun")) @@ -138,7 +138,7 @@ class SkyRenderer( skyboxMesh.draw() } - override fun drawPost() { + override fun drawPre() { renderWindow.renderSystem.reset(depth = DepthFunctions.LESS_OR_EQUAL) drawSkybox() drawSun() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt index 176f5d63d..7f1c4e908 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt @@ -41,12 +41,14 @@ interface RenderSystem { blending: Boolean = false, faceCulling: Boolean = true, depthMask: Boolean = true, + sourceRGB: BlendingFunctions = BlendingFunctions.ONE, + destinationRGB: BlendingFunctions = BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, sourceAlpha: BlendingFunctions = BlendingFunctions.ONE, - destinationAlpha: BlendingFunctions = BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, + destinationAlpha: BlendingFunctions = BlendingFunctions.ZERO, depth: DepthFunctions = DepthFunctions.LESS, clearColor: RGBColor = Colors.TRANSPARENT, ) { - setBlendFunction(sourceAlpha, destinationAlpha, BlendingFunctions.ONE, BlendingFunctions.ZERO) + setBlendFunction(sourceRGB, destinationRGB, sourceAlpha, destinationAlpha) this[RenderingCapabilities.DEPTH_TEST] = depthTest this[RenderingCapabilities.BLENDING] = blending this[RenderingCapabilities.FACE_CULLING] = faceCulling diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TranslucentDrawable.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TranslucentDrawable.kt index 20e56f6ef..01fe5181a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TranslucentDrawable.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TranslucentDrawable.kt @@ -8,7 +8,13 @@ interface TranslucentDrawable : Renderer { get() = false fun setupTranslucent() { - renderSystem.reset(sourceAlpha = BlendingFunctions.SOURCE_ALPHA, destinationAlpha = BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, blending = true) + renderSystem.reset( + blending = true, + sourceRGB = BlendingFunctions.SOURCE_ALPHA, + destinationRGB = BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, + sourceAlpha = BlendingFunctions.ONE, + destinationAlpha = BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, + ) } fun drawTranslucent() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TransparentDrawable.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TransparentDrawable.kt index 14a515389..d7fc2b260 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TransparentDrawable.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/phases/TransparentDrawable.kt @@ -7,7 +7,7 @@ interface TransparentDrawable : Renderer { get() = false fun setupTransparent() { - renderSystem.reset() + renderSystem.reset(blending = true) } fun drawTransparent() diff --git a/src/main/resources/assets/minosoft/rendering/shader/particle/particle.fsh b/src/main/resources/assets/minosoft/rendering/shader/particle/particle.fsh index 1de936da9..664071706 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/particle/particle.fsh +++ b/src/main/resources/assets/minosoft/rendering/shader/particle/particle.fsh @@ -36,6 +36,8 @@ void main() { #ifdef TRANSPARENT if (foutColor.a < 0.3f){ discard; + } else { + foutColor.a = 1.0f; } #endif return; @@ -53,6 +55,8 @@ void main() { #ifdef TRANSPARENT if (foutColor.a < 0.3f){ discard; + } else { + foutColor.a = 1.0f; } #endif } diff --git a/src/main/resources/assets/minosoft/rendering/shader/world/world.fsh b/src/main/resources/assets/minosoft/rendering/shader/world/world.fsh index b38ff93f7..b4f74f919 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/world/world.fsh +++ b/src/main/resources/assets/minosoft/rendering/shader/world/world.fsh @@ -38,6 +38,8 @@ void work() { #ifdef TRANSPARENT if (foutColor.a < 0.3f){ discard; + } else { + foutColor.a = 1.0f; } #endif return; @@ -54,6 +56,8 @@ void work() { #ifdef TRANSPARENT if (foutColor.a < 0.3f) { discard; + } else { + foutColor.a = 1.0f; } #endif }