From 53e847d66c4aa4bea085d0fa316e918bd8b2656d Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 11 Dec 2021 22:14:24 +0900 Subject: [PATCH] floatframebuffer for almost everything and the glblending craps out again --- assets/shaders/alphadither.frag | 3 +- src/net/torvald/terrarum/App.java | 7 ++- src/net/torvald/terrarum/PostProcessor.kt | 22 ++++---- src/net/torvald/terrarum/Terrarum.kt | 11 ++-- .../terrarum/modulebasegame/IngameRenderer.kt | 53 +++++++++---------- .../terrarum/modulebasegame/TitleScreen.kt | 7 ++- .../torvald/terrarum/weather/WeatherMixer.kt | 13 +---- 7 files changed, 52 insertions(+), 64 deletions(-) diff --git a/assets/shaders/alphadither.frag b/assets/shaders/alphadither.frag index 125ac1fd8..151f57eb8 100644 --- a/assets/shaders/alphadither.frag +++ b/assets/shaders/alphadither.frag @@ -29,5 +29,6 @@ void main() { vec4 selvec = vec4(0.0, 0.0, 0.0, (alpha > bayerThreshold) ? 1.0 : 0.0); - gl_FragColor = inColor * boolean.yyyx + selvec; +// gl_FragColor = inColor * boolean.yyyx + selvec; + gl_FragColor = inColor; } \ No newline at end of file diff --git a/src/net/torvald/terrarum/App.java b/src/net/torvald/terrarum/App.java index 1b62df149..00ec18721 100644 --- a/src/net/torvald/terrarum/App.java +++ b/src/net/torvald/terrarum/App.java @@ -10,7 +10,7 @@ import com.badlogic.gdx.controllers.Controllers; import com.badlogic.gdx.graphics.*; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.graphics.glutils.FrameBuffer; +import com.badlogic.gdx.graphics.glutils.FloatFrameBuffer; import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.utils.Disposable; @@ -257,7 +257,7 @@ public class App implements ApplicationListener { private static float loadTimer = 0f; private static final float showupTime = 100f / 1000f; - private static FrameBuffer renderFBO; + private static FloatFrameBuffer renderFBO; public static HashSet tempFilePool = new HashSet<>(); @@ -718,8 +718,7 @@ public class App implements ApplicationListener { (renderFBO.getWidth() != scr.getWidth() || renderFBO.getHeight() != scr.getHeight()) ) { - renderFBO = new FrameBuffer( - Pixmap.Format.RGBA8888, + renderFBO = new FloatFrameBuffer( scr.getWidth(), scr.getHeight(), false diff --git a/src/net/torvald/terrarum/PostProcessor.kt b/src/net/torvald/terrarum/PostProcessor.kt index 44529337f..e1a8cd392 100644 --- a/src/net/torvald/terrarum/PostProcessor.kt +++ b/src/net/torvald/terrarum/PostProcessor.kt @@ -12,6 +12,7 @@ import com.badlogic.gdx.graphics.glutils.ShaderProgram import com.badlogic.gdx.graphics.glutils.ShapeRenderer import com.badlogic.gdx.math.Matrix4 import com.badlogic.gdx.utils.Disposable +import net.torvald.random.HQRNG import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.ui.BasicDebugInfoWindow import net.torvald.terrarum.ui.Toolkit @@ -42,6 +43,8 @@ object PostProcessor : Disposable { private val functionRowHelper = Texture(Gdx.files.internal("assets/graphics/function_row_help.png")) + private val shaderBayer = App.loadShaderFromFile("assets/shaders/4096.vert", "assets/shaders/4096_bayer.frag") // always load the shader regardless of config because the config may cange + init { App.disposables.add(this) } @@ -54,6 +57,7 @@ object PostProcessor : Disposable { lutTex.dispose() } catch (e: UninitializedPropertyAccessException) { } + shaderBayer.dispose() } fun draw(projMat: Matrix4, fbo: FrameBuffer) { @@ -126,21 +130,19 @@ object PostProcessor : Disposable { } } } + private val rng = HQRNG() private fun postShader(projMat: Matrix4, fbo: FrameBuffer) { - val shader: ShaderProgram? = - if (App.getConfigBoolean("fx_retro")) - App.shaderHicolour - else if (App.getConfigBoolean("fx_differential")) - App.shaderDebugDiff - else - App.shaderPassthruRGB + val shader: ShaderProgram = shaderBayer + App.getCurrentDitherTex().bind(1) fbo.colorBufferTexture.bind(0) - shader?.bind() - shader?.setUniformMatrix("u_projTrans", projMat) - shader?.setUniformi("u_texture", 0) + shader.bind() + shader.setUniformMatrix("u_projTrans", projMat) + shader.setUniformi("u_texture", 0) + shader.setUniformi("rnd", rng.nextInt(8192), rng.nextInt(8192)) + shader.setUniformi("u_pattern", 1) App.fullscreenQuad.render(shader, GL20.GL_TRIANGLES) diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 57eebfbda..b6c89c97b 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -342,8 +342,8 @@ infix fun Color.mulAndAssign(other: Color): Color { fun blendMul(batch: SpriteBatch) { // will break if the colour image contains semitransparency batch.enableBlending() -// batch.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA) - batch.setBlendFunctionSeparate(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_DST_ALPHA, GL20.GL_SRC_ALPHA) + batch.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA) +// batch.setBlendFunctionSeparate(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_DST_ALPHA, GL20.GL_SRC_ALPHA) } fun blendScreen(batch: SpriteBatch) { @@ -358,7 +358,8 @@ fun blendDisable(batch: SpriteBatch) { fun blendNormal(batch: SpriteBatch) { batch.enableBlending() - batch.setBlendFunctionSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE) +// batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) + batch.setBlendFunctionSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) // ALPHA *MUST BE* PREMULTIPLIED // @@ -392,8 +393,8 @@ fun gdxSetBlend() { fun gdxSetBlendNormal() { gdxSetBlend() - Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE) -// Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_SRC_ALPHA, GL20.GL_ONE) +// Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) + Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) // ALPHA *MUST BE* PREMULTIPLIED // diff --git a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt index ac66777a9..f42125d35 100644 --- a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt +++ b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt @@ -5,6 +5,7 @@ import com.badlogic.gdx.Input import com.badlogic.gdx.graphics.* 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.FrameBuffer import com.badlogic.gdx.graphics.glutils.ShaderProgram import com.badlogic.gdx.utils.Disposable @@ -49,21 +50,21 @@ object IngameRenderer : Disposable { private lateinit var blurWriteQuad2: Mesh private lateinit var blurWriteQuad4: Mesh - private lateinit var lightmapFboA: FrameBuffer - private lateinit var lightmapFboB: FrameBuffer - private lateinit var fboRGB: FrameBuffer - private lateinit var fboRGB_lightMixed: FrameBuffer - private lateinit var fboA: FrameBuffer - private lateinit var fboA_lightMixed: FrameBuffer - private lateinit var fboMixedOut: FrameBuffer + private lateinit var lightmapFboA: FloatFrameBuffer + private lateinit var lightmapFboB: 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 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: FrameBuffer - private lateinit var fboBlurQuarter: FrameBuffer + private lateinit var fboBlurHalf: FloatFrameBuffer + private lateinit var fboBlurQuarter: FloatFrameBuffer // you must have lightMixed FBO; otherwise you'll be reading from unbaked FBO and it freaks out GPU @@ -495,7 +496,7 @@ object IngameRenderer : Disposable { gdxSetBlend() - App.getCurrentDitherTex().bind(1) +// App.getCurrentDitherTex().bind(1) Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // so that batch that comes next will bind any tex to it batch.inUse { @@ -584,7 +585,7 @@ object IngameRenderer : Disposable { setCameraPosition(0f, 0f) val (xrem, yrem) = worldCamToRenderPos() - App.getCurrentDitherTex().bind(1) +// App.getCurrentDitherTex().bind(1) Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // so that batch that comes next will bind any tex to it batch.inUse { @@ -684,7 +685,7 @@ object IngameRenderer : Disposable { private var blurtex4 = Texture(16, 16, Pixmap.Format.RGBA8888) - fun processKawaseBlur(outFbo: FrameBuffer) { + fun processKawaseBlur(outFbo: FloatFrameBuffer) { blurtex0.dispose() @@ -781,19 +782,17 @@ object IngameRenderer : Disposable { fboBlurQuarter.dispose() } - fboRGB = FrameBuffer(Pixmap.Format.RGBA8888, width, height, true) - fboRGB_lightMixed = FrameBuffer(Pixmap.Format.RGBA8888, width, height, true) - fboA = FrameBuffer(Pixmap.Format.RGBA8888, width, height, true) - fboA_lightMixed = FrameBuffer(Pixmap.Format.RGBA8888, width, height, true) - fboMixedOut = FrameBuffer(Pixmap.Format.RGBA8888, width, height, true) - lightmapFboA = FrameBuffer( - Pixmap.Format.RGBA8888, + fboRGB = FloatFrameBuffer(width, height, true) + fboRGB_lightMixed = FloatFrameBuffer(width, height, true) + fboA = FloatFrameBuffer(width, height, true) + fboA_lightMixed = FloatFrameBuffer(width, height, true) + fboMixedOut = FloatFrameBuffer(width, height, true) + lightmapFboA = FloatFrameBuffer( LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(), LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(), true ) - lightmapFboB = FrameBuffer( - Pixmap.Format.RGBA8888, + lightmapFboB = FloatFrameBuffer( LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(), LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(), true @@ -804,15 +803,13 @@ object IngameRenderer : Disposable { blurTex = TextureRegion() mixedOutTex = TextureRegion(fboMixedOut.colorBufferTexture) - fboBlurHalf = FrameBuffer( - Pixmap.Format.RGBA8888, - LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 2, - LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 2, - true + fboBlurHalf = FloatFrameBuffer( + LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 2, + LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 2, + true ) - fboBlurQuarter = FrameBuffer( - Pixmap.Format.RGBA8888, + fboBlurQuarter = FloatFrameBuffer( LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 4, LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 4, true diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index ae295eb7f..05763aaa2 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -4,11 +4,10 @@ import com.badlogic.gdx.Gdx import com.badlogic.gdx.InputAdapter import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.OrthographicCamera -import com.badlogic.gdx.graphics.Pixmap 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.FrameBuffer +import com.badlogic.gdx.graphics.glutils.FloatFrameBuffer import com.jme3.math.FastMath import net.torvald.random.HQRNG import net.torvald.terrarum.* @@ -119,7 +118,7 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { internal lateinit var uiRemoCon: UIRemoCon internal lateinit var uiFakeBlurOverlay: UICanvas - private lateinit var worldFBO: FrameBuffer + private lateinit var worldFBO: FloatFrameBuffer private val warning32bitJavaIcon = TextureRegion(Texture(Gdx.files.internal("assets/graphics/gui/32_bit_warning.tga"))) @@ -229,7 +228,7 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { Gdx.input.inputProcessor = TitleScreenController(this) - worldFBO = FrameBuffer(Pixmap.Format.RGBA8888, App.scr.width, App.scr.height, false) + worldFBO = FloatFrameBuffer(App.scr.width, App.scr.height, false) // load list of savegames println("[TitleScreen] update list of savegames") diff --git a/src/net/torvald/terrarum/weather/WeatherMixer.kt b/src/net/torvald/terrarum/weather/WeatherMixer.kt index 34ee7d55a..45e6e3961 100644 --- a/src/net/torvald/terrarum/weather/WeatherMixer.kt +++ b/src/net/torvald/terrarum/weather/WeatherMixer.kt @@ -13,7 +13,6 @@ import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.WorldTime -import net.torvald.terrarum.modulebasegame.IngameRenderer import net.torvald.terrarum.modulebasegame.RNGConsumer import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.ParticleMegaRain @@ -178,19 +177,9 @@ internal object WeatherMixer : RNGConsumer { skyboxTexture.dispose() skyboxTexture = Texture(skyboxPixmap); skyboxTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear) - val dither = App.getConfigBoolean("fx_dither") - - if (dither) { - App.getCurrentDitherTex().bind(1) - Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // so that batch that comes next will bind any tex to it - } batch.inUse { - it.shader = if (dither) IngameRenderer.shaderBayer else null - if (dither) { - it.shader.setUniformi("u_pattern", 1) - it.shader.setUniformi("rnd", renderng.nextInt(8192), renderng.nextInt(8192)) - } + it.shader = null it.draw(skyboxTexture, 0f, -App.scr.halfhf, App.scr.wf, App.scr.hf * 2f) // because of how the linear filter works, we extend the image by two }