From 3cf6f0cc1e88739519ab8674cce7bce6eeafd2e5 Mon Sep 17 00:00:00 2001 From: josua Date: Tue, 21 Jul 2020 09:26:20 +1000 Subject: [PATCH] Added optimisations to the shadow renderer and added fog --- src/projectzombie/display/Camera.java | 5 +- src/projectzombie/display/DisplayRender.java | 15 +++-- src/projectzombie/display/DisplayWindow.java | 8 +++ .../entity/player/EntityPlayer.java | 4 -- src/projectzombie/menu/Menu.java | 1 - src/projectzombie/menu/MenuInventory.java | 1 - src/projectzombie/menu/MenuMain.java | 1 - src/projectzombie/menu/MenuSettings.java | 1 - src/projectzombie/model/ModelGui.java | 8 +-- .../world/layer/layergen/LayerGenEarth.java | 10 +-- src/resources/shader/environmentRenderer.fsh | 62 +++++++++---------- src/resources/shader/environmentRenderer.vsh | 16 +++-- 12 files changed, 74 insertions(+), 58 deletions(-) diff --git a/src/projectzombie/display/Camera.java b/src/projectzombie/display/Camera.java index b1ea098..6046d70 100755 --- a/src/projectzombie/display/Camera.java +++ b/src/projectzombie/display/Camera.java @@ -37,9 +37,12 @@ public class Camera double time = Main.world.getLayer().layergen.getSunPosition(); projection_sun = Matrix4.identity(); + projection_sun = Matrix4.multiply(projection_sun, Matrix4.rotate(angle + 180, 0, 1, 0)); + projection_sun = Matrix4.multiply(projection_sun, Matrix4.translate(0, 0, 8)); + projection_sun = Matrix4.multiply(projection_sun, Matrix4.rotate(-angle - 180, 0, 1, 0)); projection_sun = Matrix4.multiply(projection_sun, Matrix4.rotate(20, 0, 0, 1)); projection_sun = Matrix4.multiply(projection_sun, Matrix4.rotate(-time, 1, 0, 0)); projection_sun = Matrix4.multiply(projection_sun, Matrix4.translate(0, 0, -16)); - projection_sun = Matrix4.multiply(projection_sun, Matrix4.scale(new Vec3d(1/32.0, 1/32.0, -1/32.0))); + projection_sun = Matrix4.multiply(projection_sun, Matrix4.scale(new Vec3d(1/20.0, 1/20.0, -1/32.0))); } } diff --git a/src/projectzombie/display/DisplayRender.java b/src/projectzombie/display/DisplayRender.java index 4be7804..9099465 100755 --- a/src/projectzombie/display/DisplayRender.java +++ b/src/projectzombie/display/DisplayRender.java @@ -24,8 +24,7 @@ public class DisplayRender { public static int shadow_fbo; public static int shadow_depth; - - private static final int SHADOW_SIZE = 4096; + public static int shadow_size = 8192; private static int generateDepthTexture(int width, int height) { @@ -39,6 +38,9 @@ public class DisplayRender GL33.glTexParameteri(GL33.GL_TEXTURE_2D, GL33.GL_TEXTURE_MIN_FILTER, GL33.GL_LINEAR); GL33.glTexParameteri(GL33.GL_TEXTURE_2D, GL33.GL_TEXTURE_MAG_FILTER, GL33.GL_LINEAR); + GL33.glTexParameteri(GL33.GL_TEXTURE_2D, GL33.GL_TEXTURE_WRAP_S, GL33.GL_CLAMP_TO_BORDER); + GL33.glTexParameteri(GL33.GL_TEXTURE_2D, GL33.GL_TEXTURE_WRAP_T, GL33.GL_CLAMP_TO_BORDER); + GL33.glTexParameterfv(GL33.GL_TEXTURE_2D, GL33.GL_TEXTURE_BORDER_COLOR, new float[] {0, 0, 0, 0}); GL33.glFramebufferTexture(GL33.GL_FRAMEBUFFER, GL33.GL_DEPTH_ATTACHMENT, depth, 0); return depth; @@ -68,7 +70,7 @@ public class DisplayRender GL33.glDrawBuffer(GL33.GL_NONE); GL33.glReadBuffer(GL33.GL_NONE); - shadow_depth = generateDepthTexture(SHADOW_SIZE, SHADOW_SIZE); + shadow_depth = generateDepthTexture(shadow_size, shadow_size); } public static void render(int w, int h) @@ -98,6 +100,7 @@ public class DisplayRender Matrix4 billboard = Matrix4.multiply(Matrix4.rotate(-45, 1, 0, 0), rotated); Main.window.environmentRenderer.use(); + GL33.glUniformMatrix4fv(Main.window.glsl_camera, true, Camera.camera.matrix.getArray()); GL33.glUniformMatrix4fv(Main.window.glsl_billboard, true, billboard.getArray()); GL33.glUniformMatrix4fv(Main.window.glsl_rotated, true, rotated.getArray()); GL33.glUniformMatrix4fv(Main.window.glsl_projection_sun, true, Camera.camera.projection_sun.getArray()); @@ -108,13 +111,14 @@ public class DisplayRender // Render from the sun/moons perspective GL33.glBindFramebuffer(GL33.GL_FRAMEBUFFER, shadow_fbo); glClear(GL_DEPTH_BUFFER_BIT); - glViewport(0, 0, SHADOW_SIZE, SHADOW_SIZE); + glViewport(0, 0, shadow_size, shadow_size); GL33.glUniformMatrix4fv(Main.window.glsl_projection, true, Camera.camera.projection_sun.getArray()); + GL33.glUniform1i(Main.window.glsl_mode, 1); LayerGen layergen = Main.world.getLayer().layergen; double sunPosition = MathHelpers.mod(layergen.getSunPosition(), 360); - if(layergen.hasSun() && sunPosition > 0 && sunPosition < 180) { + if(layergen.hasSun() && sunPosition > 0 && sunPosition < 180 && shadow_size != 1) { Main.world.render(camera); } @@ -123,6 +127,7 @@ public class DisplayRender glViewport(0, 0, w, h); GL33.glUniformMatrix4fv(Main.window.glsl_projection, true, Camera.camera.projection.getArray()); + GL33.glUniform1i(Main.window.glsl_mode, 0); Main.world.render(camera); player.chunk = Main.world.getLayer().getChunk(player.getPos().xz()); diff --git a/src/projectzombie/display/DisplayWindow.java b/src/projectzombie/display/DisplayWindow.java index 43b9b29..918470f 100755 --- a/src/projectzombie/display/DisplayWindow.java +++ b/src/projectzombie/display/DisplayWindow.java @@ -40,14 +40,17 @@ public class DisplayWindow implements IMainloopTask public int effect_vao; + public int glsl_mist; public int glsl_color; public int glsl_contrast; public int glsl_tex_cut; public int glsl_model; + public int glsl_camera; public int glsl_projection; public int glsl_projection_sun; public int glsl_rotated; public int glsl_billboard; + public int glsl_mode; public int glsl_time; public int glsl_day_low; @@ -122,7 +125,9 @@ public class DisplayWindow implements IMainloopTask environmentRenderer = new GraphicsShader("/resources/shader/environmentRenderer"); environmentRenderer.use(); + glsl_mist = GL33.glGetUniformLocation(environmentRenderer.program, "mist"); glsl_model = GL33.glGetUniformLocation(environmentRenderer.program, "model"); + glsl_camera = GL33.glGetUniformLocation(environmentRenderer.program, "camera"); glsl_rotated = GL33.glGetUniformLocation(environmentRenderer.program, "rotated"); glsl_projection = GL33.glGetUniformLocation(environmentRenderer.program, "projection"); glsl_projection_sun = GL33.glGetUniformLocation(environmentRenderer.program, "projection_sun"); @@ -131,6 +136,7 @@ public class DisplayWindow implements IMainloopTask glsl_color = GL33.glGetUniformLocation(environmentRenderer.program, "color"); glsl_contrast = GL33.glGetUniformLocation(environmentRenderer.program, "contrast"); glsl_billboard = GL33.glGetUniformLocation(environmentRenderer.program, "billboard"); + glsl_mode = GL33.glGetUniformLocation(environmentRenderer.program, "mode"); glsl_day_low = GL33.glGetUniformLocation(environmentRenderer.program, "lighting_day_low"); glsl_day_high = GL33.glGetUniformLocation(environmentRenderer.program, "lighting_day_high"); @@ -191,6 +197,8 @@ public class DisplayWindow implements IMainloopTask environmentRenderer.use(); DisplayLighting.updateLighting(); + GL33.glUniform1f(glsl_mist, 0); + if(Main.player.getHydration() < 0.2) { GL33.glUniform1f(glsl_contrast, (float)(0.2 - Main.player.getHydration()) * 1.6f); } else { diff --git a/src/projectzombie/entity/player/EntityPlayer.java b/src/projectzombie/entity/player/EntityPlayer.java index 4888adf..52e8b06 100755 --- a/src/projectzombie/entity/player/EntityPlayer.java +++ b/src/projectzombie/entity/player/EntityPlayer.java @@ -138,10 +138,6 @@ public class EntityPlayer extends Entity implements @Override public double getLightLevel() { - if(Main.menu.playerEmitsLight) { - return getLightWithHeight(1); - } - ItemStack item = inventory.getItem(inventory_hand); if(!item.isEmpty()) { diff --git a/src/projectzombie/menu/Menu.java b/src/projectzombie/menu/Menu.java index 5f3742e..a3913f6 100755 --- a/src/projectzombie/menu/Menu.java +++ b/src/projectzombie/menu/Menu.java @@ -8,7 +8,6 @@ public abstract class Menu public boolean doGameRender; public boolean keepMouse = true; public boolean showIngameGUI = true; - public boolean playerEmitsLight = false; public Input input; public abstract void render(); diff --git a/src/projectzombie/menu/MenuInventory.java b/src/projectzombie/menu/MenuInventory.java index 638358b..d5fb9a1 100644 --- a/src/projectzombie/menu/MenuInventory.java +++ b/src/projectzombie/menu/MenuInventory.java @@ -40,7 +40,6 @@ public class MenuInventory extends Menu doGameloop = parent.doGameloop; doGameRender = parent.doGameRender; - playerEmitsLight = parent.playerEmitsLight; showIngameGUI = parent.showIngameGUI; keepMouse = false; diff --git a/src/projectzombie/menu/MenuMain.java b/src/projectzombie/menu/MenuMain.java index ee02466..eb8fc28 100755 --- a/src/projectzombie/menu/MenuMain.java +++ b/src/projectzombie/menu/MenuMain.java @@ -17,7 +17,6 @@ public class MenuMain extends Menu this.doGameRender = true; this.keepMouse = false; this.showIngameGUI = false; - this.playerEmitsLight = true; this.gui = new GUI(); this.input = new InputGUI(gui); diff --git a/src/projectzombie/menu/MenuSettings.java b/src/projectzombie/menu/MenuSettings.java index 7fd5c23..5bcd08e 100755 --- a/src/projectzombie/menu/MenuSettings.java +++ b/src/projectzombie/menu/MenuSettings.java @@ -29,7 +29,6 @@ public class MenuSettings extends Menu doGameloop = false; doGameRender = menuOld.doGameRender; showIngameGUI = menuOld.showIngameGUI; - playerEmitsLight = menuOld.playerEmitsLight; keepMouse = false; GUIButtonGroup group = new GUIButtonGroup(); diff --git a/src/projectzombie/model/ModelGui.java b/src/projectzombie/model/ModelGui.java index 6877e3a..177de48 100644 --- a/src/projectzombie/model/ModelGui.java +++ b/src/projectzombie/model/ModelGui.java @@ -57,10 +57,10 @@ public class ModelGui extends Model height = y; return new float[] { - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, asi, asp, o, 0, 0, - x, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, asi, asp, o, 0, 0, - x, y, 0, 1, 1, 0, 0, 1, 0, 0, 0, asi, asp, o, 0, 0, - 0, y, 0, 0, 1, 0, 0, 1, 0, 0, 0, asi, asp, o, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, asi, asp, o, 0, 0b10000, + x, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, asi, asp, o, 0, 0b10000, + x, y, 0, 1, 1, 0, 0, 1, 0, 0, 0, asi, asp, o, 0, 0b10000, + 0, y, 0, 0, 1, 0, 0, 1, 0, 0, 0, asi, asp, o, 0, 0b10000, }; } diff --git a/src/projectzombie/world/layer/layergen/LayerGenEarth.java b/src/projectzombie/world/layer/layergen/LayerGenEarth.java index d7a0c71..201a4e8 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenEarth.java +++ b/src/projectzombie/world/layer/layergen/LayerGenEarth.java @@ -165,7 +165,7 @@ public class LayerGenEarth extends LayerGen @Override public void spawnEntities(Layer layer, Random rand) { - if(rand.nextDouble() > 0.98 && getEarthLight() < -0.3) + if(rand.nextDouble() > 0.98 && getEarthLight() < 0.4) { Vec3d ppos = Main.player.getPos(); @@ -202,7 +202,7 @@ public class LayerGenEarth extends LayerGen } private double getEarthLight() { - return MathHelpers.sin(((MathHelpers.TWO_PI * (GameTimer.getTime() % 720000)) / 72000.0) + MathHelpers.PI/4); + return MathHelpers.sin(((MathHelpers.TWO_PI * (GameTimer.getTime() % 720000)) / 72000.0) + MathHelpers.PI/4) * 0.5 + 0.5; } @Override @@ -218,13 +218,13 @@ public class LayerGenEarth extends LayerGen @Override public ColorRange getLightLevel() { - double light = getEarthLight(); + double light = getEarthLight() * 2 - 1; ColorRange daylightRange = new ColorRange( - new Vec3d(31/255.0, 15/255.0, 0), + new Vec3d(-255/255.0, -244/255.0, -208/255.0), new Vec3d(205/255.0, 191/255.0, 162/255.0)); - Vec3d daylight = daylightRange.getColor(light); + Vec3d daylight = daylightRange.getColor(MathHelpers.sin(light) * 0.5 + 0.5); return new ColorRange(daylight.multiply(7/8.0), daylight); } } diff --git a/src/resources/shader/environmentRenderer.fsh b/src/resources/shader/environmentRenderer.fsh index bd2feb4..c26e95c 100644 --- a/src/resources/shader/environmentRenderer.fsh +++ b/src/resources/shader/environmentRenderer.fsh @@ -4,6 +4,7 @@ in vec3 pPos; in vec3 pTexture; in vec3 pLightMapPos; in vec3 pSunDepth; +in float pCameraDepth; flat in int pFlags; flat in float pFade; @@ -25,6 +26,7 @@ uniform vec2 tex_cut; uniform vec4 color; uniform float contrast; +uniform int mode; vec3 color_grass_hot_wet = vec3(0.05, 0.8, 0); vec3 color_grass_hot_dry = vec3(1, 0.6, 0); @@ -65,39 +67,37 @@ vec3 interpolate2RGB(float x, float y, vec3 v00, vec3 v01, vec3 v10, vec3 v11) { void main() { - vec4 light = texture(lightmap, vec2( - map(pLightMapPos.x, lightmap_offset.x, lightmap_offset.x + lightmap_size.x, 0, 1), - map(pLightMapPos.z, lightmap_offset.y, lightmap_offset.y + lightmap_size.y, 0, 1))); - + vec4 textureRGB = texture(atlas, pTexture); - vec2 sunDepthTexPos = pSunDepth.xy * 0.5 + 0.5; - float shadowAmount = 0; - - //shadowAmount += pSunDepth.z < (texture(depthmap, sunDepthTexPos + vec2( 0.5, 0.5) / 2048.0).r * 2 - 1 + depth_c) ? 1 : 0; - //shadowAmount += pSunDepth.z < (texture(depthmap, sunDepthTexPos + vec2( 0.5, -0.5) / 2048.0).r * 2 - 1 + depth_c) ? 1 : 0; - //shadowAmount += pSunDepth.z < (texture(depthmap, sunDepthTexPos + vec2(-0.5, 0.5) / 2048.0).r * 2 - 1 + depth_c) ? 1 : 0; - //shadowAmount += pSunDepth.z < (texture(depthmap, sunDepthTexPos + vec2(-0.5, -0.5) / 2048.0).r * 2 - 1 + depth_c) ? 1 : 0; - - shadowAmount += pSunDepth.z < (texture(depthmap, sunDepthTexPos).r * 2 - 1 + depth_c) ? 1 : 0; - - vec3 light_day = mapVec(shadowAmount, 0, 1, lighting_day_low, lighting_day_high); - vec3 light_src = vec3(1, 1, 1) * (scaleLight(max(0, light.g)) - abs(pLightMapPos.y) * 0.1); - vec4 rgb = vec4((pRGB % 64) / 64.0, ((pRGB >> 6) % 64) / 64.0, ((pRGB >> 12) % 64) / 64.0, 1); - - vec4 color_grass = vec4(interpolate2RGB( - smoothStep(light.b), smoothStep(light.a), - color_grass_cold_dry, color_grass_hot_dry, - color_grass_cold_wet, color_grass_hot_wet), 1); + if(mode == 0) + { + vec4 light = texture(lightmap, vec2( + map(pLightMapPos.x, lightmap_offset.x, lightmap_offset.x + lightmap_size.x, 0, 1), + map(pLightMapPos.z, lightmap_offset.y, lightmap_offset.y + lightmap_size.y, 0, 1))); + + vec2 sunDepthTexPos = pSunDepth.xy * 0.5 + 0.5; - float saturation = contrast * 1.6 + 1; - - FragColor = texture(atlas, pTexture) * (mod(int(pFlags / 4), 2) == 1 ? color_grass : vec4(1,1,1,1)) - * color * vec4(biggest(light_day, light_src), pFade) * (mod(int(pFlags / 2), 2) == 1 ? rgb : vec4(1, 1, 1, 1)) - * saturation + contrast; + vec3 light_day = pSunDepth.z < (texture(depthmap, sunDepthTexPos).r * 2 - 1 + depth_c + ) ? lighting_day_high : lighting_day_low; + vec3 light_src = vec3(1, 1, 1) * (scaleLight(max(0, light.g)) - abs(pLightMapPos.y) * 0.1); + vec4 rgb = vec4((pRGB % 64) / 64.0, ((pRGB >> 6) % 64) / 64.0, ((pRGB >> 12) % 64) / 64.0, 1); + + vec4 color_grass = vec4(interpolate2RGB( + smoothStep(light.b), smoothStep(light.a), + color_grass_cold_dry, color_grass_hot_dry, + color_grass_cold_wet, color_grass_hot_wet), 1); + + float saturation = contrast * 1.6 + 1; + float fog = pCameraDepth; - FragColor.r = min(1, FragColor.r); - FragColor.g = min(1, FragColor.g); - FragColor.b = min(1, FragColor.b); + FragColor = (fog + (1 - fog) * textureRGB * (mod(int(pFlags / 4), 2) == 1 ? color_grass : vec4(1,1,1,1)) * color) + * vec4(biggest(light_day, light_src), pFade) * (mod(int(pFlags / 2), 2) == 1 ? rgb : vec4(1, 1, 1, 1)) + * saturation + contrast; + + FragColor.r = min(1, FragColor.r); + FragColor.g = min(1, FragColor.g); + FragColor.b = min(1, FragColor.b); + } - discard(FragColor.a == 0 || (pPos.x > tex_cut.y && tex_cut.x > 0.5)); + discard(textureRGB.a == 0 || (pPos.x > tex_cut.y && tex_cut.x > 0.5)); } \ No newline at end of file diff --git a/src/resources/shader/environmentRenderer.vsh b/src/resources/shader/environmentRenderer.vsh index 820ca78..c0a7c2c 100644 --- a/src/resources/shader/environmentRenderer.vsh +++ b/src/resources/shader/environmentRenderer.vsh @@ -7,6 +7,7 @@ layout (location = 3) in vec3 aOffset; layout (location = 4) in vec2 aAnimate; layout (location = 5) in vec3 aFlags; +out float pCameraDepth; out vec3 pSunDepth; out vec3 pLightMapPos; out vec3 pTexture; @@ -16,12 +17,15 @@ flat out int pFlags; flat out float pFade; flat out int pRGB; +uniform mat4 camera; uniform mat4 projection_sun; uniform mat4 billboard; uniform mat4 projection; uniform mat4 model; uniform mat4 rotated; +uniform float mist; uniform int time; +uniform int mode; float map(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; @@ -57,15 +61,19 @@ float getTexY() void main() { int type = int(aFlags.z); - pRGB = int(aFlags.y); - pFade = aFlags.x; vec4 pos = vec4(aPos, 1) * (mod(type >> 3, 2) == 1 ? billboard : (mod(type, 2) == 1 ? rotated : mat4(1))) * translate(aOffset) * model; gl_Position = pos * projection; - pSunDepth = (pos * projection_sun).xyz; - pLightMapPos = pos.xyz; + + if(mode == 0) { + pCameraDepth = mod(type >> 4, 2) == 1 ? 0 : min(1, mist * (-(pos * camera).z * 0.5 + 0.5)); + pSunDepth = (pos * projection_sun).xyz; + pLightMapPos = pos.xyz; + pRGB = int(aFlags.y); + pFade = aFlags.x; + } pTexture = vec3(aTex.x, getTexY(), aTex.z); pFlags = type;