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);
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.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<File> 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

View File

@@ -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)

View File

@@ -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 //

View File

@@ -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

View File

@@ -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")

View File

@@ -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
}