ton of framebuffer changes and fixes

This commit is contained in:
Bixilon 2021-12-14 15:25:18 +01:00
parent cba569f6a6
commit 13ce836539
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
11 changed files with 55 additions and 18 deletions

View File

@ -3,18 +3,21 @@ package de.bixilon.minosoft.gui.rendering.framebuffer
import de.bixilon.minosoft.gui.rendering.Drawable
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.framebuffer.defaultf.DefaultFramebuffer
import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
class FramebufferManager(
private val renderWindow: RenderWindow,
) : Drawable {
val default = DefaultFramebuffer(renderWindow)
// val gui = GUIFramebuffer(renderWindow)
fun init() {
default.init()
// gui = renderWindow.renderSystem.createFramebuffer(2)
renderWindow.connection.registerEvent(CallbackEventInvoker.of<ResizeWindowEvent> {
default.framebuffer.resize(it.size)
})
}

View File

@ -2,7 +2,6 @@ package de.bixilon.minosoft.gui.rendering.framebuffer.defaultf
import de.bixilon.minosoft.gui.rendering.Drawable
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.system.base.RenderingCapabilities
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer
import de.bixilon.minosoft.util.KUtil.toResourceLocation
@ -16,15 +15,14 @@ class DefaultFramebuffer(
fun init() {
framebuffer.init()
shader.load()
shader.setInt("uTexture", 0)
mesh.load()
}
override fun draw() {
renderWindow.renderSystem.framebuffer = null
renderWindow.renderSystem.disable(RenderingCapabilities.DEPTH_TEST)
framebuffer.bindTexture()
shader.use()
shader.setInt("uTexture", 0)
mesh.draw()
}
}

View File

@ -10,10 +10,10 @@ class DefaultFramebufferMesh(renderWindow: RenderWindow) : Mesh(renderWindow, De
init {
val vertices = arrayOf(
Vec2(-1.0f, -1.0f) to Vec2(0.0f, 0.0f),
Vec2(-1.0f, +1.0f) to Vec2(0.0f, 1.0f),
Vec2(+1.0f, +1.0f) to Vec2(1.0f, 1.0f),
Vec2(+1.0f, -1.0f) to Vec2(1.0f, 0.0f),
Vec2(-1.0f, -1.0f) to Vec2(0.0f, 1.0f),
Vec2(-1.0f, +1.0f) to Vec2(0.0f, 0.0f),
Vec2(+1.0f, +1.0f) to Vec2(1.0f, 0.0f),
Vec2(+1.0f, -1.0f) to Vec2(1.0f, 1.0f),
)
for ((positionIndex, textureIndex) in this.order) {
addVertex(vertices[positionIndex].first, vertices[textureIndex].second)

View File

@ -2,6 +2,7 @@ package de.bixilon.minosoft.gui.rendering.system.base.buffer.frame
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.texture.FramebufferTexture
import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.Renderbuffer
import glm_.vec2.Vec2i
interface Framebuffer {
val state: FramebufferState
@ -13,4 +14,6 @@ interface Framebuffer {
fun attach(texture: FramebufferTexture)
fun bindTexture()
fun resize(size: Vec2i)
}

View File

@ -7,4 +7,5 @@ interface FramebufferTexture {
// ToDo: Mode
fun init()
fun unload()
}

View File

@ -7,4 +7,5 @@ interface Renderbuffer {
val size: Vec2i
fun init()
fun unload()
}

View File

@ -231,7 +231,7 @@ class OpenGLRenderSystem(
}
override fun createFramebuffer(): Framebuffer {
return OpenGLFramebuffer()
return OpenGLFramebuffer(renderWindow.window.size)
}
override fun createTextureManager(): TextureManager {

View File

@ -10,24 +10,27 @@ import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.render.OpenGLRende
import glm_.vec2.Vec2i
import org.lwjgl.opengl.GL30.*
class OpenGLFramebuffer : Framebuffer {
class OpenGLFramebuffer(var size: Vec2i) : Framebuffer {
override var state: FramebufferState = FramebufferState.PREPARING
private set
private var id = -1
private lateinit var texture: OpenGLFramebufferTexture
private lateinit var renderbuffer: OpenGLRenderbuffer
override fun init() {
check(state == FramebufferState.PREPARING) { "Framebuffer is already (un)loaded!" }
check(state != FramebufferState.COMPLETE) { "Framebuffer is complete!" }
id = glGenFramebuffers()
unsafeBind()
texture = OpenGLFramebufferTexture(Vec2i(900, 500)) // ToDo
glViewport(0, 0, size.x, size.y)
texture = OpenGLFramebufferTexture(size)
texture.init()
attach(texture)
val renderbuffer = OpenGLRenderbuffer(RenderbufferModes.DEPTH_24_STENCIL_8, Vec2i(900, 500)) // ToDo
renderbuffer = OpenGLRenderbuffer(RenderbufferModes.DEPTH_COMPONENT24, size)
renderbuffer.init()
attach(renderbuffer)
@ -51,7 +54,7 @@ class OpenGLFramebuffer : Framebuffer {
override fun attach(renderbuffer: Renderbuffer) {
check(renderbuffer is OpenGLRenderbuffer) { "Can not attach non OpenGL renderbuffer!" }
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuffer.id)
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer.id)
}
override fun attach(texture: FramebufferTexture) {
@ -62,10 +65,27 @@ class OpenGLFramebuffer : Framebuffer {
override fun delete() {
check(state == FramebufferState.COMPLETE) { "Framebuffer is incomplete!" }
glDeleteFramebuffers(id)
id = -1
state = FramebufferState.DELETED
}
override fun bindTexture() {
check(state == FramebufferState.COMPLETE) { "Framebuffer is incomplete!" }
glBindTexture(GL_TEXTURE_2D, texture.id)
}
override fun resize(size: Vec2i) {
if (size == this.size) {
return
}
if (this::texture.isInitialized) {
texture.unload()
}
if (this::renderbuffer.isInitialized) {
renderbuffer.unload()
}
this.size = size
delete()
init()
}
}

View File

@ -14,8 +14,14 @@ class OpenGLFramebufferTexture(
override fun init() {
id = glGenTextures()
glBindTexture(GL_TEXTURE_2D, id)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.x, size.y, 0, GL_RGB, GL_UNSIGNED_BYTE, null as ByteBuffer?)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, null as ByteBuffer?)
//glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT24, size.x, size.y, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
}
override fun unload() {
glDeleteTextures(id)
id = -1
}
}

View File

@ -22,6 +22,11 @@ class OpenGLRenderbuffer(
glBindRenderbuffer(GL_RENDERBUFFER, id)
}
override fun unload() {
glDeleteRenderbuffers(id)
id = -1
}
companion object {
private val RenderbufferModes.gl: Int
get() {

View File

@ -14,7 +14,7 @@
#version 330 core
layout (location = 0) in vec2 vinPosition;
layout (location = 0) in vec2 vinUV;
layout (location = 1) in vec2 vinUV;
out vec2 finUV;