From e4b947ce69bd9dc3993de3241439216ba4df5190 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 16 Aug 2023 17:51:31 +0900 Subject: [PATCH] Float16FrameBuffer --- .../graphics/glutils/Float16FrameBuffer.java | 50 +++++++++++++++++++ src/net/torvald/terrarum/App.java | 6 +-- .../terrarum/modulebasegame/IngameRenderer.kt | 39 +++++++-------- .../terrarum/modulebasegame/TitleScreen.kt | 6 +-- src/net/torvald/terrarum/ui/Toolkit.kt | 14 +++--- 5 files changed, 82 insertions(+), 33 deletions(-) create mode 100644 src/com/badlogic/gdx/graphics/glutils/Float16FrameBuffer.java diff --git a/src/com/badlogic/gdx/graphics/glutils/Float16FrameBuffer.java b/src/com/badlogic/gdx/graphics/glutils/Float16FrameBuffer.java new file mode 100644 index 000000000..fe86d306e --- /dev/null +++ b/src/com/badlogic/gdx/graphics/glutils/Float16FrameBuffer.java @@ -0,0 +1,50 @@ +package com.badlogic.gdx.graphics.glutils; + +import com.badlogic.gdx.Application; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL30; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.utils.GdxRuntimeException; + +/** + * Created by minjaesong on 2023-08-16. + */ +public class Float16FrameBuffer extends FrameBuffer { + + Float16FrameBuffer () { + } + + /** Creates a GLFrameBuffer from the specifications provided by bufferBuilder + * + * @param bufferBuilder **/ + protected Float16FrameBuffer (GLFrameBufferBuilder> bufferBuilder) { + super(bufferBuilder); + } + + /** Creates a new FrameBuffer with a float backing texture, having the given dimensions and potentially a depth buffer + * attached. + * + * @param width the width of the framebuffer in pixels + * @param height the height of the framebuffer in pixels + * @param hasDepth whether to attach a depth buffer + * @throws GdxRuntimeException in case the FrameBuffer could not be created */ + public Float16FrameBuffer (int width, int height, boolean hasDepth) { + FloatFrameBufferBuilder bufferBuilder = new FloatFrameBufferBuilder(width, height); + bufferBuilder.addFloatAttachment(GL30.GL_RGBA16F, GL30.GL_RGBA, GL30.GL_FLOAT, false); + if (hasDepth) bufferBuilder.addBasicDepthRenderBuffer(); + this.bufferBuilder = bufferBuilder; + + build(); + } + + @Override + protected Texture createTexture (FrameBufferTextureAttachmentSpec attachmentSpec) { + FloatTextureData data = new FloatTextureData(bufferBuilder.width, bufferBuilder.height, attachmentSpec.internalFormat, + attachmentSpec.format, attachmentSpec.type, attachmentSpec.isGpuOnly); + Texture result = new Texture(data); + result.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); + result.setWrap(Texture.TextureWrap.ClampToEdge, Texture.TextureWrap.ClampToEdge); + return result; + } + +} diff --git a/src/net/torvald/terrarum/App.java b/src/net/torvald/terrarum/App.java index 837e106d7..8c1c704f5 100644 --- a/src/net/torvald/terrarum/App.java +++ b/src/net/torvald/terrarum/App.java @@ -273,7 +273,7 @@ public class App implements ApplicationListener { private static float loadTimer = 0f; private static final float showupTime = 100f / 1000f; - private static FloatFrameBuffer renderFBO; + private static Float16FrameBuffer renderFBO; public static HashSet tempFilePool = new HashSet<>(); @@ -753,12 +753,12 @@ public class App implements ApplicationListener { (renderFBO.getWidth() != scr.getWidth() || renderFBO.getHeight() != scr.getHeight()) ) { - renderFBO = new FloatFrameBuffer( + renderFBO = new Float16FrameBuffer( scr.getWidth(), scr.getHeight(), false ); - postProcessorOutFBO2 = new FloatFrameBuffer( + postProcessorOutFBO2 = new Float16FrameBuffer( scr.getWidth() * 2, scr.getHeight() * 2, false diff --git a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt index f3b35521c..8d913ead9 100644 --- a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt +++ b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt @@ -4,11 +4,10 @@ import com.badlogic.gdx.Gdx import com.badlogic.gdx.Input import com.badlogic.gdx.graphics.* import com.badlogic.gdx.graphics.g2d.TextureRegion -import com.badlogic.gdx.graphics.glutils.FloatFrameBuffer +import com.badlogic.gdx.graphics.glutils.Float16FrameBuffer import com.badlogic.gdx.graphics.glutils.FrameBuffer import com.badlogic.gdx.graphics.glutils.ShaderProgram import com.badlogic.gdx.utils.Disposable -import com.badlogic.gdx.utils.GdxRuntimeException import net.torvald.random.HQRNG import net.torvald.terrarum.* import net.torvald.terrarum.App.* @@ -53,20 +52,20 @@ object IngameRenderer : Disposable { private lateinit var blurWriteQuad2: Mesh // private lateinit var blurWriteQuad4: Mesh - private lateinit var lightmapFbo: FloatFrameBuffer - private lateinit var fboRGB: FloatFrameBuffer - private lateinit var fboRGB_lightMixed: FloatFrameBuffer - private lateinit var fboA: FloatFrameBuffer - private lateinit var fboA_lightMixed: FloatFrameBuffer - private lateinit var fboMixedOut: FloatFrameBuffer + private lateinit var lightmapFbo: Float16FrameBuffer + private lateinit var fboRGB: Float16FrameBuffer + private lateinit var fboRGB_lightMixed: Float16FrameBuffer + private lateinit var fboA: Float16FrameBuffer + private lateinit var fboA_lightMixed: Float16FrameBuffer + private lateinit var fboMixedOut: Float16FrameBuffer private lateinit var rgbTex: TextureRegion private lateinit var aTex: TextureRegion private lateinit var mixedOutTex: TextureRegion private lateinit var lightTex: TextureRegion private lateinit var blurTex: TextureRegion - private lateinit var fboBlurHalf: FloatFrameBuffer -// private lateinit var fboBlurQuarter: FloatFrameBuffer + private lateinit var fboBlurHalf: Float16FrameBuffer +// private lateinit var fboBlurQuarter: Float16FrameBuffer // you must have lightMixed FBO; otherwise you'll be reading from unbaked FBO and it freaks out GPU @@ -694,7 +693,7 @@ object IngameRenderer : Disposable { private const val KAWASE_POWER = 1.5f - fun processNoBlur(outFbo: FloatFrameBuffer) { + fun processNoBlur(outFbo: Float16FrameBuffer) { blurtex0.dispose() @@ -710,7 +709,7 @@ object IngameRenderer : Disposable { } } - fun processKawaseBlur(outFbo: FloatFrameBuffer) { + fun processKawaseBlur(outFbo: Float16FrameBuffer) { blurtex0.dispose() @@ -807,12 +806,12 @@ object IngameRenderer : Disposable { //fboBlurQuarter.dispose() } - fboRGB = FloatFrameBuffer(width, height, false) - fboRGB_lightMixed = FloatFrameBuffer(width, height, false) - fboA = FloatFrameBuffer(width, height, false) - fboA_lightMixed = FloatFrameBuffer(width, height, false) - fboMixedOut = FloatFrameBuffer(width, height, false) - lightmapFbo = FloatFrameBuffer( + fboRGB = Float16FrameBuffer(width, height, false) + fboRGB_lightMixed = Float16FrameBuffer(width, height, false) + fboA = Float16FrameBuffer(width, height, false) + fboA_lightMixed = Float16FrameBuffer(width, height, false) + fboMixedOut = Float16FrameBuffer(width, height, false) + lightmapFbo = Float16FrameBuffer( LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(), LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(), false @@ -823,13 +822,13 @@ object IngameRenderer : Disposable { blurTex = TextureRegion() mixedOutTex = TextureRegion(fboMixedOut.colorBufferTexture) - fboBlurHalf = FloatFrameBuffer( + fboBlurHalf = Float16FrameBuffer( LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 2, LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 2, false ) - /*fboBlurQuarter = FloatFrameBuffer( + /*fboBlurQuarter = Float16FrameBuffer( LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 4, LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 4, false diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index 126520dd0..bc59dc94c 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -8,7 +8,7 @@ import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion -import com.badlogic.gdx.graphics.glutils.FloatFrameBuffer +import com.badlogic.gdx.graphics.glutils.Float16FrameBuffer import com.jme3.math.FastMath import net.torvald.random.HQRNG import net.torvald.terrarum.* @@ -147,7 +147,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { internal lateinit var uiRemoCon: UIRemoCon internal lateinit var uiFakeBlurOverlay: UICanvas - private lateinit var worldFBO: FloatFrameBuffer + private lateinit var worldFBO: Float16FrameBuffer private val warning32bitJavaIcon = TextureRegion(Texture(Gdx.files.internal("assets/graphics/gui/32_bit_warning.tga"))) private val warningAppleRosettaIcon = TextureRegion(Texture(Gdx.files.internal("assets/graphics/gui/apple_rosetta_warning.tga"))) @@ -262,7 +262,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { Gdx.input.inputProcessor = TitleScreenController(this) - worldFBO = FloatFrameBuffer(App.scr.width, App.scr.height, false) + worldFBO = Float16FrameBuffer(App.scr.width, App.scr.height, false) // load list of savegames printdbg(this, "update list of savegames") diff --git a/src/net/torvald/terrarum/ui/Toolkit.kt b/src/net/torvald/terrarum/ui/Toolkit.kt index d3e229511..4a147fe19 100644 --- a/src/net/torvald/terrarum/ui/Toolkit.kt +++ b/src/net/torvald/terrarum/ui/Toolkit.kt @@ -5,7 +5,7 @@ import com.badlogic.gdx.graphics.* import com.badlogic.gdx.graphics.g2d.BitmapFont import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion -import com.badlogic.gdx.graphics.glutils.FloatFrameBuffer +import com.badlogic.gdx.graphics.glutils.Float16FrameBuffer import com.badlogic.gdx.utils.Disposable import com.jme3.math.FastMath import net.torvald.random.HQRNG @@ -48,9 +48,9 @@ object Toolkit : Disposable { private val shaderBoxDown = App.loadShaderFromClasspath("shaders/default.vert", "shaders/boxdown.frag") private val shaderBoxUp = App.loadShaderFromClasspath("shaders/default.vert", "shaders/boxup.frag") - private lateinit var fboBlur: FloatFrameBuffer - private lateinit var fboBlurHalf: FloatFrameBuffer - private lateinit var fboBlurQuarter: FloatFrameBuffer + private lateinit var fboBlur: Float16FrameBuffer + private lateinit var fboBlurHalf: Float16FrameBuffer + private lateinit var fboBlurQuarter: Float16FrameBuffer private lateinit var blurWriteQuad: Mesh private lateinit var blurWriteQuad2: Mesh private lateinit var blurWriteQuad4: Mesh @@ -326,17 +326,17 @@ object Toolkit : Disposable { val fw = App.scr.width//MathUtils.nextPowerOfTwo(App.scr.width) val fh = App.scr.height//MathUtils.nextPowerOfTwo(App.scr.height) - fboBlur = FloatFrameBuffer( + fboBlur = Float16FrameBuffer( fw, fh, false ) - fboBlurHalf = FloatFrameBuffer( + fboBlurHalf = Float16FrameBuffer( fw / 2, fh / 2, false ) - fboBlurQuarter = FloatFrameBuffer( + fboBlurQuarter = Float16FrameBuffer( fw / 4, fh / 4, false