render sky in null framebuffer (with clipping)

This commit is contained in:
Bixilon 2021-12-15 20:33:02 +01:00
parent 52a1a119da
commit e14ec86809
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
9 changed files with 41 additions and 24 deletions

View File

@ -345,25 +345,12 @@ class RenderWindow(
renderSystem.framebuffer = renderer.framebuffer renderSystem.framebuffer = renderer.framebuffer
renderer.prepareDraw() 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 renderSystem.framebuffer = null
framebufferManager.draw()
renderAll(rendererList, true)
renderSystem.reset() // Reset to enable depth mask, etc again renderSystem.reset() // Reset to enable depth mask, etc again
renderStats.endDraw() renderStats.endDraw()
@ -418,4 +405,23 @@ class RenderWindow(
operator fun <T : Renderer> get(renderer: RendererBuilder<T>): T? { operator fun <T : Renderer> get(renderer: RendererBuilder<T>): T? {
return rendererMap[renderer.RESOURCE_LOCATION].unsafeCast() return rendererMap[renderer.RESOURCE_LOCATION].unsafeCast()
} }
private fun renderAll(rendererList: Collection<Renderer>, 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)
}
}
}
} }

View File

@ -19,8 +19,10 @@ import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer
interface Renderer { interface Renderer {
val renderWindow: RenderWindow val renderWindow: RenderWindow
val renderSystem: RenderSystem val renderSystem: RenderSystem
val framebuffer: Framebuffer val framebuffer: Framebuffer?
get() = renderWindow.framebufferManager.default.framebuffer get() = renderWindow.framebufferManager.default.framebuffer
val post: Boolean
get() = false
fun init() = Unit fun init() = Unit

View File

@ -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.defaultf.DefaultFramebuffer
import de.bixilon.minosoft.gui.rendering.framebuffer.gui.GUIFramebuffer import de.bixilon.minosoft.gui.rendering.framebuffer.gui.GUIFramebuffer
import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent 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 import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
class FramebufferManager( class FramebufferManager(
@ -34,7 +33,6 @@ class FramebufferManager(
override fun draw() { override fun draw() {
default.draw() default.draw()
renderWindow.renderSystem.clear(IntegratedBufferTypes.DEPTH_BUFFER, IntegratedBufferTypes.STENCIL_BUFFER)
gui.draw() gui.draw()
} }
} }

View File

@ -29,6 +29,7 @@ interface IntegratedFramebuffer : Drawable {
override fun draw() { override fun draw() {
renderWindow.renderSystem.framebuffer = null renderWindow.renderSystem.framebuffer = null
renderWindow.renderSystem.reset(blending = true)
framebuffer.bindTexture() framebuffer.bindTexture()
shader.use() shader.use()
mesh.draw() mesh.draw()

View File

@ -22,9 +22,9 @@ import de.bixilon.minosoft.gui.rendering.Renderer
import de.bixilon.minosoft.gui.rendering.RendererBuilder import de.bixilon.minosoft.gui.rendering.RendererBuilder
import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent 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.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.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.RenderingCapabilities 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.phases.CustomDrawable
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
import de.bixilon.minosoft.gui.rendering.util.mesh.SimpleTextureMesh import de.bixilon.minosoft.gui.rendering.util.mesh.SimpleTextureMesh
@ -48,6 +48,8 @@ class SkyRenderer(
private lateinit var sunTexture: AbstractTexture private lateinit var sunTexture: AbstractTexture
private var updateSun: Boolean = true private var updateSun: Boolean = true
var baseColor = RenderConstants.DEFAULT_SKY_COLOR var baseColor = RenderConstants.DEFAULT_SKY_COLOR
override val framebuffer: Framebuffer? = null
override val post: Boolean = true
override fun init() { override fun init() {
@ -135,13 +137,13 @@ class SkyRenderer(
} }
private fun drawSkybox() { private fun drawSkybox() {
renderSystem.setBlendFunc(BlendingFunctions.SOURCE_ALPHA, BlendingFunctions.ONE_MINUS_SOURCE_ALPHA, BlendingFunctions.ONE, BlendingFunctions.ZERO) // ToDo
checkSkyColor() checkSkyColor()
skyboxShader.use() skyboxShader.use()
skyboxMesh.draw() skyboxMesh.draw()
} }
override fun drawCustom() { override fun drawCustom() {
renderWindow.renderSystem.reset(depth = DepthFunctions.LESS_OR_EQUAL)
drawSkybox() drawSkybox()
drawSun() drawSun()
} }

View File

@ -22,4 +22,8 @@ uniform sampler2D uTexture;
void main() { void main() {
foutColor = texture(uTexture, finUV); foutColor = texture(uTexture, finUV);
if (foutColor.a == 0.0f) {
discard;
}
} }

View File

@ -22,4 +22,8 @@ uniform sampler2D uTexture;
void main() { void main() {
foutColor = texture(uTexture, finUV); foutColor = texture(uTexture, finUV);
if (foutColor.a == 0.0f) {
discard;
}
} }

View File

@ -19,6 +19,6 @@ layout (location = 1) in vec2 vinUV;
out vec2 finUV; out vec2 finUV;
void main() { void main() {
gl_Position = vec4(vinPosition, 0.0f, 1.0f); gl_Position = vec4(vinPosition, -0.1f, 1.0f);
finUV = vinUV; finUV = vinUV;
} }

View File

@ -22,7 +22,7 @@ uniform mat4 uSkyViewProjectionMatrix;
uniform vec4 uSkyColor; uniform vec4 uSkyColor;
void main() { void main() {
gl_Position = (uSkyViewProjectionMatrix * vec4(vinPosition, 1.0)).xyww; gl_Position = uSkyViewProjectionMatrix * vec4(vinPosition, 1.0);
finColor = uSkyColor; finColor = uSkyColor;
} }