mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-08 04:41:51 +09:00
floatframebuffer for almost everything and the glblending craps out again
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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 //
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user