From 7f7c31d27f48530d345162cf51610ea7a66caafb Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 29 Jan 2019 17:35:56 +0900 Subject: [PATCH] nice try, but it crashes the gpu AND I get <1 fps :( --- assets/raytracelight.frag | 13 ++++++++---- src/net/torvald/terrarum/AppLoader.java | 21 +++++++++++-------- src/net/torvald/terrarum/DefaultConfig.kt | 1 - .../worlddrawer/LightmapRendererNew.kt | 18 ++++++++-------- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/assets/raytracelight.frag b/assets/raytracelight.frag index 2590ccb1e..fcf21433f 100644 --- a/assets/raytracelight.frag +++ b/assets/raytracelight.frag @@ -61,12 +61,18 @@ vec2[TRAVERSE_SIZE] traceRay(int arraySize, vec2 from, vec2 to) { void main() { + // this code will produce y-flipped image. It's your job to flip it again (e.g. using y-flipped fullscreen quad) + + // Nice try, but it kills GPU :( + // reason: looks like traceRayCount() returns value greater than TRAVERSE_SIZE. + // even if I make traceRayCount() to return constant 3, I get less than 1 fps on GTX 970. + vec4 outColor = vec4(0.0,0.0,0.0,0.0); // 1. pick a light source for (int y = 0; y < int(outSize.y); y++) { for (int x = 0; x < int(outSize.x); x++) { - vec2 from = vec2(x, y); + vec2 from = vec2(x + 0.5, y + 0.5); // +0.5 is used because gl_FragCoord does vec2 to = gl_FragCoord.xy; vec2 delta = to - from; int traceCount = traceRayCount(delta); @@ -94,10 +100,9 @@ void main() { } gl_FragColor = outColor * multiplier; - gl_FragColor = vec4(0,1,0,1); + //gl_FragColor = vec4(0,1,0,1); - gl_FragColor = vec4(texture2D(lights, gl_FragCoord.xy / outSize)) * multiplier; + //gl_FragColor = sampleFrom(lights, gl_FragCoord.xy) * multiplier; - // FIXME (gl_FragCoord / outSize) != v_texCoords } diff --git a/src/net/torvald/terrarum/AppLoader.java b/src/net/torvald/terrarum/AppLoader.java index 9648466d2..87067b2e5 100644 --- a/src/net/torvald/terrarum/AppLoader.java +++ b/src/net/torvald/terrarum/AppLoader.java @@ -496,7 +496,7 @@ public class AppLoader implements ApplicationListener { logoBatch.setProjectionMatrix(camera.combined); } - private void updateFullscreenQuad(int WIDTH, int HEIGHT) { + private void updateFullscreenQuad(int WIDTH, int HEIGHT) { // NOT y-flipped quads! fullscreenQuad.setVertices(new float[]{ 0f, 0f, 0f, 1f, 1f, 1f, 1f, 0f, 1f, WIDTH, 0f, 0f, 1f, 1f, 1f, 1f, 1f, 1f, @@ -650,16 +650,19 @@ public class AppLoader implements ApplicationListener { * Return config from config set. If the config does not exist, default value will be returned. * @param key * * - * @return Config from config set or default config if it does not exist. - * * - * @throws NullPointerException if the specified config simply does not exist. + * @return Config from config set or default config if it does not exist. If the default value is undefined, will return false. */ public static boolean getConfigBoolean(String key) { - Object cfg = getConfigMaster(key); - if (cfg instanceof JsonPrimitive) - return ((JsonPrimitive) cfg).getAsBoolean(); - else - return ((boolean) cfg); + try { + Object cfg = getConfigMaster(key); + if (cfg instanceof JsonPrimitive) + return ((JsonPrimitive) cfg).getAsBoolean(); + else + return ((boolean) cfg); + } + catch (NullPointerException keyNotFound) { + return false; + } } public static int[] getConfigIntArray(String key) { diff --git a/src/net/torvald/terrarum/DefaultConfig.kt b/src/net/torvald/terrarum/DefaultConfig.kt index f2c9d9967..ec094afa0 100644 --- a/src/net/torvald/terrarum/DefaultConfig.kt +++ b/src/net/torvald/terrarum/DefaultConfig.kt @@ -24,7 +24,6 @@ object DefaultConfig { jsonObject.addProperty("notificationshowuptime", 6500) jsonObject.addProperty("multithread", true) // experimental! jsonObject.addProperty("multithreadedlight", false) // experimental! - jsonObject.addProperty("gpulightcalc", true) // experimental! diff --git a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt index 869fb013f..728b78ad7 100644 --- a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt @@ -105,10 +105,6 @@ object LightmapRenderer { if (SHADER_LIGHTING) { lightCalcShader = AppLoader.loadShader("assets/4096.vert", "assets/raytracelight.frag") - lightCalcShader.setUniformf("outSize", LIGHTMAP_WIDTH.toFloat(), LIGHTMAP_HEIGHT.toFloat()) - lightCalcShader.setUniformi("shades", SHADEMAP_UNIT) - lightCalcShader.setUniformi("lights", LIGHTMAP_UNIT) - lightCalcShader.setUniformi("u_texture", 0) texturedLightMap = FrameBuffer(Pixmap.Format.RGBA8888, LIGHTMAP_WIDTH, LIGHTMAP_HEIGHT, false) //texturedLightMap = Texture(LIGHTMAP_WIDTH, LIGHTMAP_HEIGHT, Pixmap.Format.RGBA8888) @@ -133,11 +129,11 @@ object LightmapRenderer { VertexAttribute.ColorUnpacked(), VertexAttribute.TexCoords(0) ) - texturedLightQuad.setVertices(floatArrayOf( - 0f, 0f, 0f, 1f, 1f, 1f, 1f, 0f, 1f, - LIGHTMAP_WIDTH.toFloat(), 0f, 0f, 1f, 1f, 1f, 1f, 1f, 1f, - LIGHTMAP_WIDTH.toFloat(), LIGHTMAP_HEIGHT.toFloat(), 0f, 1f, 1f, 1f, 1f, 1f, 0f, - 0f, LIGHTMAP_HEIGHT.toFloat(), 0f, 1f, 1f, 1f, 1f, 0f, 0f)) + texturedLightQuad.setVertices(floatArrayOf( // y-flipped quads! + 0f, 0f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, + LIGHTMAP_WIDTH.toFloat(), 0f, 0f, 1f, 1f, 1f, 1f, 1f, 0f, + LIGHTMAP_WIDTH.toFloat(), LIGHTMAP_HEIGHT.toFloat(), 0f, 1f, 1f, 1f, 1f, 1f, 1f, + 0f, LIGHTMAP_HEIGHT.toFloat(), 0f, 1f, 1f, 1f, 1f, 0f, 1f)) texturedLightQuad.setIndices(shortArrayOf(0, 1, 2, 2, 3, 0)) texturedLightCamera = OrthographicCamera(LIGHTMAP_WIDTH.toFloat(), LIGHTMAP_HEIGHT.toFloat()) @@ -433,7 +429,11 @@ object LightmapRenderer { texturedLightSources.bind(LIGHTMAP_UNIT) lightCalcShader.begin() + // it seems that every time shader ends, uniforms reset themselves. lightCalcShader.setUniformMatrix("u_projTrans", texturedLightCamera.combined) + lightCalcShader.setUniformf("outSize", LIGHTMAP_WIDTH.toFloat(), LIGHTMAP_HEIGHT.toFloat()) + lightCalcShader.setUniformi("shades", SHADEMAP_UNIT) + lightCalcShader.setUniformi("lights", LIGHTMAP_UNIT) texturedLightQuad.render(lightCalcShader, GL20.GL_TRIANGLES) lightCalcShader.end() }