floatframebuffer for almost everything and the glblending craps out again

This commit is contained in:
minjaesong
2021-12-11 22:14:24 +09:00
parent 10819e2607
commit 53e847d66c
7 changed files with 52 additions and 64 deletions

View File

@@ -29,5 +29,6 @@ void main() {
vec4 selvec = vec4(0.0, 0.0, 0.0, (alpha > bayerThreshold) ? 1.0 : 0.0); 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;
} }

View File

@@ -10,7 +10,7 @@ import com.badlogic.gdx.controllers.Controllers;
import com.badlogic.gdx.graphics.*; import com.badlogic.gdx.graphics.*;
import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion; 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.ShaderProgram;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.Disposable;
@@ -257,7 +257,7 @@ public class App implements ApplicationListener {
private static float loadTimer = 0f; private static float loadTimer = 0f;
private static final float showupTime = 100f / 1000f; private static final float showupTime = 100f / 1000f;
private static FrameBuffer renderFBO; private static FloatFrameBuffer renderFBO;
public static HashSet<File> tempFilePool = new HashSet<>(); public static HashSet<File> tempFilePool = new HashSet<>();
@@ -718,8 +718,7 @@ public class App implements ApplicationListener {
(renderFBO.getWidth() != scr.getWidth() || (renderFBO.getWidth() != scr.getWidth() ||
renderFBO.getHeight() != scr.getHeight()) renderFBO.getHeight() != scr.getHeight())
) { ) {
renderFBO = new FrameBuffer( renderFBO = new FloatFrameBuffer(
Pixmap.Format.RGBA8888,
scr.getWidth(), scr.getWidth(),
scr.getHeight(), scr.getHeight(),
false false

View File

@@ -12,6 +12,7 @@ import com.badlogic.gdx.graphics.glutils.ShaderProgram
import com.badlogic.gdx.graphics.glutils.ShapeRenderer import com.badlogic.gdx.graphics.glutils.ShapeRenderer
import com.badlogic.gdx.math.Matrix4 import com.badlogic.gdx.math.Matrix4
import com.badlogic.gdx.utils.Disposable import com.badlogic.gdx.utils.Disposable
import net.torvald.random.HQRNG
import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gamecontroller.KeyToggler
import net.torvald.terrarum.ui.BasicDebugInfoWindow import net.torvald.terrarum.ui.BasicDebugInfoWindow
import net.torvald.terrarum.ui.Toolkit 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 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 { init {
App.disposables.add(this) App.disposables.add(this)
} }
@@ -54,6 +57,7 @@ object PostProcessor : Disposable {
lutTex.dispose() lutTex.dispose()
} }
catch (e: UninitializedPropertyAccessException) { } catch (e: UninitializedPropertyAccessException) { }
shaderBayer.dispose()
} }
fun draw(projMat: Matrix4, fbo: FrameBuffer) { fun draw(projMat: Matrix4, fbo: FrameBuffer) {
@@ -126,21 +130,19 @@ object PostProcessor : Disposable {
} }
} }
} }
private val rng = HQRNG()
private fun postShader(projMat: Matrix4, fbo: FrameBuffer) { private fun postShader(projMat: Matrix4, fbo: FrameBuffer) {
val shader: ShaderProgram? = val shader: ShaderProgram = shaderBayer
if (App.getConfigBoolean("fx_retro"))
App.shaderHicolour
else if (App.getConfigBoolean("fx_differential"))
App.shaderDebugDiff
else
App.shaderPassthruRGB
App.getCurrentDitherTex().bind(1)
fbo.colorBufferTexture.bind(0) fbo.colorBufferTexture.bind(0)
shader?.bind() shader.bind()
shader?.setUniformMatrix("u_projTrans", projMat) shader.setUniformMatrix("u_projTrans", projMat)
shader?.setUniformi("u_texture", 0) 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) App.fullscreenQuad.render(shader, GL20.GL_TRIANGLES)

View File

@@ -342,8 +342,8 @@ infix fun Color.mulAndAssign(other: Color): Color {
fun blendMul(batch: SpriteBatch) { fun blendMul(batch: SpriteBatch) {
// will break if the colour image contains semitransparency // will break if the colour image contains semitransparency
batch.enableBlending() batch.enableBlending()
// batch.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_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) // batch.setBlendFunctionSeparate(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_DST_ALPHA, GL20.GL_SRC_ALPHA)
} }
fun blendScreen(batch: SpriteBatch) { fun blendScreen(batch: SpriteBatch) {
@@ -358,7 +358,8 @@ fun blendDisable(batch: SpriteBatch) {
fun blendNormal(batch: SpriteBatch) { fun blendNormal(batch: SpriteBatch) {
batch.enableBlending() 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 // // ALPHA *MUST BE* PREMULTIPLIED //
@@ -392,8 +393,8 @@ fun gdxSetBlend() {
fun gdxSetBlendNormal() { fun gdxSetBlendNormal() {
gdxSetBlend() gdxSetBlend()
Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE) // Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
// Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_SRC_ALPHA, GL20.GL_ONE) 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 // // ALPHA *MUST BE* PREMULTIPLIED //

View File

@@ -5,6 +5,7 @@ import com.badlogic.gdx.Input
import com.badlogic.gdx.graphics.* import com.badlogic.gdx.graphics.*
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion 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.FrameBuffer
import com.badlogic.gdx.graphics.glutils.ShaderProgram import com.badlogic.gdx.graphics.glutils.ShaderProgram
import com.badlogic.gdx.utils.Disposable import com.badlogic.gdx.utils.Disposable
@@ -49,21 +50,21 @@ object IngameRenderer : Disposable {
private lateinit var blurWriteQuad2: Mesh private lateinit var blurWriteQuad2: Mesh
private lateinit var blurWriteQuad4: Mesh private lateinit var blurWriteQuad4: Mesh
private lateinit var lightmapFboA: FrameBuffer private lateinit var lightmapFboA: FloatFrameBuffer
private lateinit var lightmapFboB: FrameBuffer private lateinit var lightmapFboB: FloatFrameBuffer
private lateinit var fboRGB: FrameBuffer private lateinit var fboRGB: FloatFrameBuffer
private lateinit var fboRGB_lightMixed: FrameBuffer private lateinit var fboRGB_lightMixed: FloatFrameBuffer
private lateinit var fboA: FrameBuffer private lateinit var fboA: FloatFrameBuffer
private lateinit var fboA_lightMixed: FrameBuffer private lateinit var fboA_lightMixed: FloatFrameBuffer
private lateinit var fboMixedOut: FrameBuffer private lateinit var fboMixedOut: FloatFrameBuffer
private lateinit var rgbTex: TextureRegion private lateinit var rgbTex: TextureRegion
private lateinit var aTex: TextureRegion private lateinit var aTex: TextureRegion
private lateinit var mixedOutTex: TextureRegion private lateinit var mixedOutTex: TextureRegion
private lateinit var lightTex: TextureRegion private lateinit var lightTex: TextureRegion
private lateinit var blurTex: TextureRegion private lateinit var blurTex: TextureRegion
private lateinit var fboBlurHalf: FrameBuffer private lateinit var fboBlurHalf: FloatFrameBuffer
private lateinit var fboBlurQuarter: FrameBuffer private lateinit var fboBlurQuarter: FloatFrameBuffer
// you must have lightMixed FBO; otherwise you'll be reading from unbaked FBO and it freaks out GPU // 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() 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 Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // so that batch that comes next will bind any tex to it
batch.inUse { batch.inUse {
@@ -584,7 +585,7 @@ object IngameRenderer : Disposable {
setCameraPosition(0f, 0f) setCameraPosition(0f, 0f)
val (xrem, yrem) = worldCamToRenderPos() 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 Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // so that batch that comes next will bind any tex to it
batch.inUse { batch.inUse {
@@ -684,7 +685,7 @@ object IngameRenderer : Disposable {
private var blurtex4 = Texture(16, 16, Pixmap.Format.RGBA8888) private var blurtex4 = Texture(16, 16, Pixmap.Format.RGBA8888)
fun processKawaseBlur(outFbo: FrameBuffer) { fun processKawaseBlur(outFbo: FloatFrameBuffer) {
blurtex0.dispose() blurtex0.dispose()
@@ -781,19 +782,17 @@ object IngameRenderer : Disposable {
fboBlurQuarter.dispose() fboBlurQuarter.dispose()
} }
fboRGB = FrameBuffer(Pixmap.Format.RGBA8888, width, height, true) fboRGB = FloatFrameBuffer(width, height, true)
fboRGB_lightMixed = FrameBuffer(Pixmap.Format.RGBA8888, width, height, true) fboRGB_lightMixed = FloatFrameBuffer(width, height, true)
fboA = FrameBuffer(Pixmap.Format.RGBA8888, width, height, true) fboA = FloatFrameBuffer(width, height, true)
fboA_lightMixed = FrameBuffer(Pixmap.Format.RGBA8888, width, height, true) fboA_lightMixed = FloatFrameBuffer(width, height, true)
fboMixedOut = FrameBuffer(Pixmap.Format.RGBA8888, width, height, true) fboMixedOut = FloatFrameBuffer(width, height, true)
lightmapFboA = FrameBuffer( lightmapFboA = FloatFrameBuffer(
Pixmap.Format.RGBA8888,
LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(), LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(),
LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(), LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(),
true true
) )
lightmapFboB = FrameBuffer( lightmapFboB = FloatFrameBuffer(
Pixmap.Format.RGBA8888,
LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(), LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(),
LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(), LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(),
true true
@@ -804,15 +803,13 @@ object IngameRenderer : Disposable {
blurTex = TextureRegion() blurTex = TextureRegion()
mixedOutTex = TextureRegion(fboMixedOut.colorBufferTexture) mixedOutTex = TextureRegion(fboMixedOut.colorBufferTexture)
fboBlurHalf = FrameBuffer( fboBlurHalf = FloatFrameBuffer(
Pixmap.Format.RGBA8888, LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 2,
LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 2, LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 2,
LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 2, true
true
) )
fboBlurQuarter = FrameBuffer( fboBlurQuarter = FloatFrameBuffer(
Pixmap.Format.RGBA8888,
LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 4, LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 4,
LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 4, LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt() / 4,
true true

View File

@@ -4,11 +4,10 @@ import com.badlogic.gdx.Gdx
import com.badlogic.gdx.InputAdapter import com.badlogic.gdx.InputAdapter
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.OrthographicCamera
import com.badlogic.gdx.graphics.Pixmap
import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion 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 com.jme3.math.FastMath
import net.torvald.random.HQRNG import net.torvald.random.HQRNG
import net.torvald.terrarum.* import net.torvald.terrarum.*
@@ -119,7 +118,7 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) {
internal lateinit var uiRemoCon: UIRemoCon internal lateinit var uiRemoCon: UIRemoCon
internal lateinit var uiFakeBlurOverlay: UICanvas 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"))) 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) 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 // load list of savegames
println("[TitleScreen] update list of savegames") println("[TitleScreen] update list of savegames")

View File

@@ -13,7 +13,6 @@ import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gamecontroller.KeyToggler
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.gameworld.WorldTime import net.torvald.terrarum.gameworld.WorldTime
import net.torvald.terrarum.modulebasegame.IngameRenderer
import net.torvald.terrarum.modulebasegame.RNGConsumer import net.torvald.terrarum.modulebasegame.RNGConsumer
import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.modulebasegame.gameactors.ParticleMegaRain import net.torvald.terrarum.modulebasegame.gameactors.ParticleMegaRain
@@ -178,19 +177,9 @@ internal object WeatherMixer : RNGConsumer {
skyboxTexture.dispose() skyboxTexture.dispose()
skyboxTexture = Texture(skyboxPixmap); skyboxTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear) 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 { batch.inUse {
it.shader = if (dither) IngameRenderer.shaderBayer else null it.shader = null
if (dither) {
it.shader.setUniformi("u_pattern", 1)
it.shader.setUniformi("rnd", renderng.nextInt(8192), renderng.nextInt(8192))
}
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 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
} }