diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt index 9a406bed5..5517a4248 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt @@ -345,25 +345,12 @@ class RenderWindow( renderSystem.framebuffer = renderer.framebuffer renderer.prepareDraw() } + renderAll(rendererList, false) - for (phase in RenderPhases.VALUES) { // ToDo: Move this up after frame buffers - for (renderer in rendererList) { - if (renderer is SkipAll && renderer.skipAll) { - continue - } - if (!phase.type.java.isAssignableFrom(renderer::class.java)) { - continue - } - if (phase.invokeSkip(renderer)) { - continue - } - renderSystem.framebuffer = renderer.framebuffer - phase.invokeSetup(renderer) - phase.invokeDraw(renderer) - } - } - framebufferManager.draw() renderSystem.framebuffer = null + framebufferManager.draw() + renderAll(rendererList, true) + renderSystem.reset() // Reset to enable depth mask, etc again renderStats.endDraw() @@ -418,4 +405,23 @@ class RenderWindow( operator fun get(renderer: RendererBuilder): T? { return rendererMap[renderer.RESOURCE_LOCATION].unsafeCast() } + + private fun renderAll(rendererList: Collection, post: Boolean) { + for (phase in RenderPhases.VALUES) { + for (renderer in rendererList) { + if ((renderer.post != post) || renderer is SkipAll && renderer.skipAll) { + continue + } + if (!phase.type.java.isAssignableFrom(renderer::class.java)) { + continue + } + if (phase.invokeSkip(renderer)) { + continue + } + renderSystem.framebuffer = renderer.framebuffer + phase.invokeSetup(renderer) + phase.invokeDraw(renderer) + } + } + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/Renderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/Renderer.kt index 621b14adc..455cfa474 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/Renderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/Renderer.kt @@ -19,8 +19,10 @@ import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer interface Renderer { val renderWindow: RenderWindow val renderSystem: RenderSystem - val framebuffer: Framebuffer + val framebuffer: Framebuffer? get() = renderWindow.framebufferManager.default.framebuffer + val post: Boolean + get() = false fun init() = Unit diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/FramebufferManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/FramebufferManager.kt index a8646b786..6a1a5de22 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/FramebufferManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/FramebufferManager.kt @@ -5,7 +5,6 @@ import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.framebuffer.defaultf.DefaultFramebuffer import de.bixilon.minosoft.gui.rendering.framebuffer.gui.GUIFramebuffer import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent -import de.bixilon.minosoft.gui.rendering.system.base.IntegratedBufferTypes import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker class FramebufferManager( @@ -34,7 +33,6 @@ class FramebufferManager( override fun draw() { default.draw() - renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER, IntegratedBufferTypes.STENCIL_BUFFER) gui.draw() } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/IntegratedFramebuffer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/IntegratedFramebuffer.kt index f967b3984..f41c5817d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/IntegratedFramebuffer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/IntegratedFramebuffer.kt @@ -29,6 +29,7 @@ interface IntegratedFramebuffer : Drawable { override fun draw() { renderWindow.renderSystem.framebuffer = null + renderWindow.renderSystem.reset(blending = true) framebuffer.bindTexture() shader.use() mesh.draw() 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 94305da5c..09dc7d80d 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 @@ -22,9 +22,9 @@ import de.bixilon.minosoft.gui.rendering.Renderer import de.bixilon.minosoft.gui.rendering.RendererBuilder import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions -import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem import de.bixilon.minosoft.gui.rendering.system.base.RenderingCapabilities +import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer import de.bixilon.minosoft.gui.rendering.system.base.phases.CustomDrawable import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture import de.bixilon.minosoft.gui.rendering.util.mesh.SimpleTextureMesh @@ -48,6 +48,8 @@ class SkyRenderer( private lateinit var sunTexture: AbstractTexture private var updateSun: Boolean = true var baseColor = RenderConstants.DEFAULT_SKY_COLOR + override val framebuffer: Framebuffer? = null + override val post: Boolean = true override fun init() { @@ -135,13 +137,13 @@ class SkyRenderer( } private fun drawSkybox() { + renderSystem.setBlendFunc(BlendingFunctions.SOURCE_ALPHA, BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, BlendingFunctions.ONE, BlendingFunctions.ZERO) // ToDo checkSkyColor() skyboxShader.use() skyboxMesh.draw() } override fun drawCustom() { - renderWindow.renderSystem.reset(depth = DepthFunctions.LESS_OR_EQUAL) drawSkybox() drawSun() } diff --git a/src/main/resources/assets/minosoft/rendering/shader/framebuffer/default/default.fsh b/src/main/resources/assets/minosoft/rendering/shader/framebuffer/default/default.fsh index c413d9af5..7308f7bba 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/framebuffer/default/default.fsh +++ b/src/main/resources/assets/minosoft/rendering/shader/framebuffer/default/default.fsh @@ -22,4 +22,8 @@ uniform sampler2D uTexture; void main() { foutColor = texture(uTexture, finUV); + + if (foutColor.a == 0.0f) { + discard; + } } diff --git a/src/main/resources/assets/minosoft/rendering/shader/framebuffer/gui/gui.fsh b/src/main/resources/assets/minosoft/rendering/shader/framebuffer/gui/gui.fsh index c413d9af5..7308f7bba 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/framebuffer/gui/gui.fsh +++ b/src/main/resources/assets/minosoft/rendering/shader/framebuffer/gui/gui.fsh @@ -22,4 +22,8 @@ uniform sampler2D uTexture; void main() { foutColor = texture(uTexture, finUV); + + if (foutColor.a == 0.0f) { + discard; + } } diff --git a/src/main/resources/assets/minosoft/rendering/shader/framebuffer/gui/gui.vsh b/src/main/resources/assets/minosoft/rendering/shader/framebuffer/gui/gui.vsh index 45f23f2f5..6c140313d 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/framebuffer/gui/gui.vsh +++ b/src/main/resources/assets/minosoft/rendering/shader/framebuffer/gui/gui.vsh @@ -19,6 +19,6 @@ layout (location = 1) in vec2 vinUV; out vec2 finUV; void main() { - gl_Position = vec4(vinPosition, 0.0f, 1.0f); + gl_Position = vec4(vinPosition, -0.1f, 1.0f); finUV = vinUV; } diff --git a/src/main/resources/assets/minosoft/rendering/shader/sky/skybox/skybox.vsh b/src/main/resources/assets/minosoft/rendering/shader/sky/skybox/skybox.vsh index da118a256..1301d4081 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/sky/skybox/skybox.vsh +++ b/src/main/resources/assets/minosoft/rendering/shader/sky/skybox/skybox.vsh @@ -22,7 +22,7 @@ uniform mat4 uSkyViewProjectionMatrix; uniform vec4 uSkyColor; void main() { - gl_Position = (uSkyViewProjectionMatrix * vec4(vinPosition, 1.0)).xyww; + gl_Position = uSkyViewProjectionMatrix * vec4(vinPosition, 1.0); finColor = uSkyColor; }