trying to work on issue #15 and I'm stumped

This commit is contained in:
minjaesong
2019-01-13 23:51:04 +09:00
parent ff8791f48a
commit 09b039c62f
6 changed files with 60 additions and 50 deletions

View File

@@ -30,6 +30,7 @@ uniform sampler2D tilemap; // RGBA8888
uniform sampler2D tilesAtlas; // terrain, wire, fluids, etc. uniform sampler2D tilesAtlas; // terrain, wire, fluids, etc.
uniform sampler2D tilesBlendAtlas; // weather mix (e.g. yellowed grass) uniform sampler2D tilesBlendAtlas; // weather mix (e.g. yellowed grass)
uniform sampler2D backbuffer;
uniform float tilesBlend = 0.0; // percentage of blending [0f..1f]. 0: draws tilesAtlas, 1: draws tilesBlendAtlas uniform float tilesBlend = 0.0; // percentage of blending [0f..1f]. 0: draws tilesAtlas, 1: draws tilesBlendAtlas
uniform ivec2 tilesInAtlas = ivec2(256, 256); uniform ivec2 tilesInAtlas = ivec2(256, 256);
@@ -67,6 +68,7 @@ void main() {
// READ THE FUCKING MANUAL, YOU DONKEY !! // // READ THE FUCKING MANUAL, YOU DONKEY !! //
// This code purposedly uses flipped fragcoord. // // This code purposedly uses flipped fragcoord. //
// Make sure you don't use gl_FragCoord unknowingly! // // Make sure you don't use gl_FragCoord unknowingly! //
// Remember, if there's a compile error, shader SILENTLY won't do anything //
// default gl_FragCoord takes half-integer (represeting centre of the pixel) -- could be useful for phys solver? // default gl_FragCoord takes half-integer (represeting centre of the pixel) -- could be useful for phys solver?
@@ -109,6 +111,11 @@ void main() {
vec4 finalBreakage = texture2D(tilesAtlas, finalUVCoordForBreakage); vec4 finalBreakage = texture2D(tilesAtlas, finalUVCoordForBreakage);
gl_FragColor = colourFilter * (mix(finalTile, finalBreakage, finalBreakage.a)); vec4 finalColor = mix(finalTile, finalBreakage, finalBreakage.a);
vec4 backbufferColor = texture2D(backbuffer, gl_FragCoord.xy / screenDimension);
//gl_FragColor = colourFilter * finalColor;
// v
gl_FragColor = colourFilter * mix(backbufferColor, finalColor, 1);
} }

View File

@@ -222,15 +222,9 @@ public class AppLoader implements ApplicationListener {
logo = new TextureRegion(new Texture(Gdx.files.internal("assets/graphics/logo_placeholder.tga"))); logo = new TextureRegion(new Texture(Gdx.files.internal("assets/graphics/logo_placeholder.tga")));
logo.flip(false, true); logo.flip(false, true);
shaderBayerSkyboxFill = new ShaderProgram(Gdx.files.internal("assets/4096.vert"), shaderBayerSkyboxFill = loadShader("assets/4096.vert", "assets/4096_bayer_skyboxfill.frag");
Gdx.files.internal("assets/4096_bayer_skyboxfill.frag") shaderHicolour = loadShader("assets/4096.vert", "assets/hicolour.frag");
); shaderColLUT = loadShader("assets/4096.vert", "assets/passthru.frag");
shaderHicolour = new ShaderProgram(Gdx.files.internal("assets/4096.vert"),
Gdx.files.internal("assets/hicolour.frag")
);
shaderColLUT = new ShaderProgram(Gdx.files.internal("assets/4096.vert"),
Gdx.files.internal("assets/passthru.frag")
);
fullscreenQuad = new Mesh( fullscreenQuad = new Mesh(
true, 4, 6, true, 4, 6,
@@ -464,9 +458,9 @@ public class AppLoader implements ApplicationListener {
defaultSaveDir = defaultDir + "/Saves"; defaultSaveDir = defaultDir + "/Saves";
configDir = defaultDir + "/config.json"; configDir = defaultDir + "/config.json";
System.out.println("os.name = $OSName (with identifier $operationSystem)"); System.out.println(String.format("os.name = %s (with identifier %s)", OSName, operationSystem));
System.out.println("os.version = $OSVersion"); System.out.println(String.format("os.version = %s", OSVersion));
System.out.println("default directory: $defaultDir"); System.out.println(String.format("default directory: %s", defaultDir));
} }
private void createDirs() { private void createDirs() {
@@ -634,15 +628,25 @@ public class AppLoader implements ApplicationListener {
// // // //
public static final void printdbg(Object obj, Object message) { public static void printdbg(Object obj, Object message) {
if (IS_DEVELOPMENT_BUILD || getConfigBoolean("forcedevbuild")) { if (IS_DEVELOPMENT_BUILD || getConfigBoolean("forcedevbuild")) {
System.out.println("[" + obj.getClass().getSimpleName() + "] " + message.toString()); System.out.println("[" + obj.getClass().getSimpleName() + "] " + message.toString());
} }
} }
public static final void printdbgerr(Object obj, Object message) { public static void printdbgerr(Object obj, Object message) {
if (IS_DEVELOPMENT_BUILD || getConfigBoolean("forcedevbuild")) { if (IS_DEVELOPMENT_BUILD || getConfigBoolean("forcedevbuild")) {
System.err.println("[" + obj.getClass().getSimpleName() + "] " + message.toString()); System.err.println("[" + obj.getClass().getSimpleName() + "] " + message.toString());
} }
} }
public static ShaderProgram loadShader(String vert, String frag) {
ShaderProgram s = new ShaderProgram(Gdx.files.internal(vert), Gdx.files.internal(frag));
if (s.getLog().contains("error C")) {
throw new Error(String.format("Shader program loaded with %s, %s failed:\n%s", vert, frag, s.getLog()));
}
return s;
}
} }

View File

@@ -50,7 +50,6 @@ object PostProcessor {
fbo.colorBufferTexture.bind(0) fbo.colorBufferTexture.bind(0)
shader?.begin() shader?.begin()
shader?.setUniformf("resolution", AppLoader.appConfig.width.toFloat(), AppLoader.appConfig.height.toFloat())
shader?.setUniformMatrix("u_projTrans", projMat) shader?.setUniformMatrix("u_projTrans", projMat)
shader?.setUniformi("u_texture", 0) shader?.setUniformi("u_texture", 0)
AppLoader.fullscreenQuad.render(shader, GL20.GL_TRIANGLES) AppLoader.fullscreenQuad.render(shader, GL20.GL_TRIANGLES)

View File

@@ -328,18 +328,18 @@ object Terrarum : Screen {
ShaderProgram.pedantic = false ShaderProgram.pedantic = false
shaderBlur = ShaderProgram(Gdx.files.internal("assets/blur.vert"), Gdx.files.internal("assets/blur.frag")) shaderBlur = AppLoader.loadShader("assets/blur.vert", "assets/blur.frag")
if (getConfigBoolean("fxdither")) { if (getConfigBoolean("fxdither")) {
shaderBayer = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/4096_bayer.frag")) shaderBayer = AppLoader.loadShader("assets/4096.vert", "assets/4096_bayer.frag")
shaderBayer.begin() shaderBayer.begin()
shaderBayer.setUniformf("rcount", 64f) shaderBayer.setUniformf("rcount", 64f)
shaderBayer.setUniformf("gcount", 64f) shaderBayer.setUniformf("gcount", 64f)
shaderBayer.setUniformf("bcount", 64f) shaderBayer.setUniformf("bcount", 64f)
shaderBayer.end() shaderBayer.end()
shaderSkyboxFill = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/4096_bayer_skyboxfill.frag")) shaderSkyboxFill = AppLoader.loadShader("assets/4096.vert", "assets/4096_bayer_skyboxfill.frag")
shaderSkyboxFill.begin() shaderSkyboxFill.begin()
shaderSkyboxFill.setUniformf("rcount", 64f) shaderSkyboxFill.setUniformf("rcount", 64f)
shaderSkyboxFill.setUniformf("gcount", 64f) shaderSkyboxFill.setUniformf("gcount", 64f)
@@ -347,15 +347,15 @@ object Terrarum : Screen {
shaderSkyboxFill.end() shaderSkyboxFill.end()
} }
else { else {
shaderBayer = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/passthru.frag")) shaderBayer = AppLoader.loadShader("assets/4096.vert", "assets/passthru.frag")
shaderSkyboxFill = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/skyboxfill.frag")) shaderSkyboxFill = AppLoader.loadShader("assets/4096.vert", "assets/skyboxfill.frag")
} }
shaderBlendGlow = ShaderProgram(Gdx.files.internal("assets/blendGlow.vert"), Gdx.files.internal("assets/blendGlow.frag")) shaderBlendGlow = AppLoader.loadShader("assets/blendGlow.vert", "assets/blendGlow.frag")
shaderRGBOnly = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/rgbonly.frag")) shaderRGBOnly = AppLoader.loadShader("assets/4096.vert", "assets/rgbonly.frag")
shaderAtoGrey = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/aonly.frag")) shaderAtoGrey = AppLoader.loadShader("assets/4096.vert", "assets/aonly.frag")
if (!shaderBlendGlow.isCompiled) { if (!shaderBlendGlow.isCompiled) {
@@ -625,19 +625,20 @@ fun blendDisable(batch: SpriteBatch? = null) {
} }
fun gdxClearAndSetBlend(r: Float, g: Float, b: Float, a: Float) { fun gdxClearAndSetBlend(r: Float, g: Float, b: Float, a: Float) {
Gdx.gl.glClearColor(0f,0f,0f,0f) Gdx.gl.glClearColor(r,g,b,a)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND) Gdx.gl.glEnable(GL20.GL_BLEND)
// this assumens premultiplied alpha? // ALPHA *MUST BE* PREMULTIPLIED //
//Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
// ALPHA MUST NOT BE PREMULTIPLIED //
// we're using separate blend func to accomodate not-premultiplied alpha
Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_SRC_ALPHA, GL20.GL_ONE)
Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD)
// One way to tell:
// 1. Check (RGB) and (A) values.
// 2. If there exist a pixel such that max(R,G,B) > (A), then the image is NOT premultiplied.
// Easy way:
// Base game (mods/basegame/blocks/terrain.tga.gz) has impure window glass. When looking at the RGB channel only:
// premultipied if the glass looks very dark.
// not premultipied if the glass looks VERY GREEN.
// helpful links: // helpful links:
// - https://gamedev.stackexchange.com/questions/82741/normal-blend-mode-with-opengl-trouble // - https://gamedev.stackexchange.com/questions/82741/normal-blend-mode-with-opengl-trouble

View File

@@ -238,7 +238,7 @@ object IngameRenderer {
} }
setCameraPosition(0f, 0f) setCameraPosition(0f, 0f)
BlocksDrawer.drawWall(batch.projectionMatrix) BlocksDrawer.drawWall(batch.projectionMatrix, fboRGB)
batch.inUse { batch.inUse {
moveCameraToWorldCoord() moveCameraToWorldCoord()
@@ -247,7 +247,7 @@ object IngameRenderer {
} }
setCameraPosition(0f, 0f) setCameraPosition(0f, 0f)
BlocksDrawer.drawTerrain(batch.projectionMatrix) BlocksDrawer.drawTerrain(batch.projectionMatrix, fboRGB)
batch.inUse { batch.inUse {
///////////////// /////////////////
@@ -262,7 +262,7 @@ object IngameRenderer {
} }
setCameraPosition(0f, 0f) setCameraPosition(0f, 0f)
BlocksDrawer.drawFront(batch.projectionMatrix, false) // blue coloured filter of water, etc. BlocksDrawer.drawFront(batch.projectionMatrix, false, fboRGB) // blue coloured filter of water, etc.
batch.inUse { batch.inUse {
FeaturesDrawer.drawEnvOverlay(batch) FeaturesDrawer.drawEnvOverlay(batch)

View File

@@ -2,21 +2,18 @@ package net.torvald.terrarum.worlddrawer
import com.badlogic.gdx.Gdx import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.* import com.badlogic.gdx.graphics.*
import com.badlogic.gdx.graphics.glutils.ShaderProgram import com.badlogic.gdx.graphics.glutils.FrameBuffer
import com.badlogic.gdx.math.Matrix4 import com.badlogic.gdx.math.Matrix4
import net.torvald.terrarum.*
import net.torvald.terrarum.AppLoader.printdbg import net.torvald.terrarum.AppLoader.printdbg
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.blockproperties.BlockCodex
import net.torvald.terrarum.ceilInt
import net.torvald.terrarum.floorInt
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.gameworld.PairedMapLayer import net.torvald.terrarum.gameworld.PairedMapLayer
import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.gameworld.fmod
import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension
import net.torvald.terrarum.modulebasegame.gameworld.WorldSimulator import net.torvald.terrarum.modulebasegame.gameworld.WorldSimulator
import net.torvald.terrarum.modulebasegame.gameworld.WorldTime import net.torvald.terrarum.modulebasegame.gameworld.WorldTime
import net.torvald.terrarum.roundInt
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import java.io.BufferedOutputStream import java.io.BufferedOutputStream
import java.io.File import java.io.File
@@ -89,7 +86,7 @@ internal object BlocksDrawer {
private lateinit var tilesQuad: Mesh private lateinit var tilesQuad: Mesh
private val shader = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/tiling.frag")) private val shader = AppLoader.loadShader("assets/4096.vert", "assets/tiling.frag")
init { init {
printdbg(this, "Unpacking textures...") printdbg(this, "Unpacking textures...")
@@ -350,33 +347,33 @@ internal object BlocksDrawer {
drawTiles(FLUID) drawTiles(FLUID)
} }
internal fun drawWall(projectionMatrix: Matrix4) { internal fun drawWall(projectionMatrix: Matrix4, backbuffer: FrameBuffer) {
// blend normal // blend normal
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND) Gdx.gl.glEnable(GL20.GL_BLEND)
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
renderUsingBuffer(WALL, projectionMatrix) renderUsingBuffer(WALL, projectionMatrix, backbuffer)
} }
internal fun drawTerrain(projectionMatrix: Matrix4) { internal fun drawTerrain(projectionMatrix: Matrix4, backbuffer: FrameBuffer) {
// blend normal // blend normal
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND) Gdx.gl.glEnable(GL20.GL_BLEND)
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
renderUsingBuffer(TERRAIN, projectionMatrix) renderUsingBuffer(TERRAIN, projectionMatrix, backbuffer)
renderUsingBuffer(FLUID, projectionMatrix) renderUsingBuffer(FLUID, projectionMatrix, backbuffer)
} }
internal fun drawFront(projectionMatrix: Matrix4, drawWires: Boolean) { internal fun drawFront(projectionMatrix: Matrix4, drawWires: Boolean, backbuffer: FrameBuffer) {
// blend mul // blend mul
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND) Gdx.gl.glEnable(GL20.GL_BLEND)
Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA) Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA)
// let's just not MUL on terrain, make it FLUID only... // let's just not MUL on terrain, make it FLUID only...
renderUsingBuffer(FLUID, projectionMatrix) renderUsingBuffer(FLUID, projectionMatrix, backbuffer)
@@ -386,7 +383,7 @@ internal object BlocksDrawer {
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
if (drawWires) { if (drawWires) {
renderUsingBuffer(WIRE, projectionMatrix) renderUsingBuffer(WIRE, projectionMatrix, backbuffer)
} }
} }
@@ -688,7 +685,7 @@ internal object BlocksDrawer {
private var _tilesBufferAsTex: Texture = Texture(1, 1, Pixmap.Format.RGBA8888) private var _tilesBufferAsTex: Texture = Texture(1, 1, Pixmap.Format.RGBA8888)
private fun renderUsingBuffer(mode: Int, projectionMatrix: Matrix4) { private fun renderUsingBuffer(mode: Int, projectionMatrix: Matrix4, backbuffer: FrameBuffer) {
//Gdx.gl.glClearColor(.094f, .094f, .094f, 0f) //Gdx.gl.glClearColor(.094f, .094f, .094f, 0f)
//Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) //Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
@@ -731,6 +728,7 @@ internal object BlocksDrawer {
_tilesBufferAsTex.dispose() _tilesBufferAsTex.dispose()
_tilesBufferAsTex = Texture(tilesBuffer) _tilesBufferAsTex = Texture(tilesBuffer)
_tilesBufferAsTex.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) _tilesBufferAsTex.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest)
backbuffer.colorBufferTexture.bind(3)
tilesTerrainBlend.texture.bind(2) tilesTerrainBlend.texture.bind(2)
_tilesBufferAsTex.bind(1) // trying 1 and 0... _tilesBufferAsTex.bind(1) // trying 1 and 0...
tileAtlas.texture.bind(0) // for some fuck reason, it must be bound as last tileAtlas.texture.bind(0) // for some fuck reason, it must be bound as last
@@ -742,6 +740,7 @@ internal object BlocksDrawer {
shader.setUniformi("tilesAtlas", 0) shader.setUniformi("tilesAtlas", 0)
shader.setUniformi("tilesBlendAtlas", 2) shader.setUniformi("tilesBlendAtlas", 2)
shader.setUniformi("tilemap", 1) shader.setUniformi("tilemap", 1)
shader.setUniformi("backbuffer", 3)
shader.setUniformi("tilemapDimension", tilesBuffer.width, tilesBuffer.height) shader.setUniformi("tilemapDimension", tilesBuffer.width, tilesBuffer.height)
shader.setUniformf("tilesInAxes", tilesInHorizontal.toFloat(), tilesInVertical.toFloat()) shader.setUniformf("tilesInAxes", tilesInHorizontal.toFloat(), tilesInVertical.toFloat())
shader.setUniformi("cameraTranslation", WorldCamera.x fmod TILE_SIZE, WorldCamera.y fmod TILE_SIZE) // usage of 'fmod' and '%' were depend on the for_x_start, which I can't just do naive int div shader.setUniformi("cameraTranslation", WorldCamera.x fmod TILE_SIZE, WorldCamera.y fmod TILE_SIZE) // usage of 'fmod' and '%' were depend on the for_x_start, which I can't just do naive int div