From 08f78c22f027ba99a2ee541cf03e1f7b4c51b0dc Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 31 Aug 2023 21:06:41 -0500 Subject: [PATCH] Move SSAO gInvProj to the CPU instead of GPU Also make Mat4f.invert() return void instead of boolean to prevent confusion about trying to pass the result into shader uniforms. --- .../distanthorizons/coreapi/util/math/Mat4f.java | 13 +++++++------ .../core/render/renderer/shaders/SSAORenderer.java | 7 +++++++ core/src/main/resources/shaders/ssao/ao.frag | 3 ++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/com/seibel/distanthorizons/coreapi/util/math/Mat4f.java b/api/src/main/java/com/seibel/distanthorizons/coreapi/util/math/Mat4f.java index 6523ddf62..72dc3e02f 100644 --- a/api/src/main/java/com/seibel/distanthorizons/coreapi/util/math/Mat4f.java +++ b/api/src/main/java/com/seibel/distanthorizons/coreapi/util/math/Mat4f.java @@ -287,17 +287,18 @@ public class Mat4f this.m23 = f; } - public boolean invert() + public boolean canInvert() + { + float det = this.adjudicateAndDet(); + return (Math.abs(det) > 1.0E-6F); + } + + public void invert() { float det = this.adjudicateAndDet(); if (Math.abs(det) > 1.0E-6F) { this.multiply(det); - return true; - } - else - { - return false; } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAORenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAORenderer.java index 553150f8a..bcddd4e1a 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAORenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAORenderer.java @@ -53,6 +53,7 @@ public class SSAORenderer private static class SsaoShaderUniforms { public int gProjUniform; + public int gInvProjUniform; public int gSampleRadUniform; public int gFactorUniform; public int gPowerUniform; @@ -100,6 +101,7 @@ public class SSAORenderer // SSAO uniform setup this.ssaoShaderUniforms.gProjUniform = this.ssaoShader.getUniformLocation("gProj"); + this.ssaoShaderUniforms.gInvProjUniform = this.ssaoShader.getUniformLocation("gInvProj"); this.ssaoShaderUniforms.gSampleRadUniform = this.ssaoShader.getUniformLocation("gSampleRad"); this.ssaoShaderUniforms.gFactorUniform = this.ssaoShader.getUniformLocation("gFactor"); this.ssaoShaderUniforms.gPowerUniform = this.ssaoShader.getUniformLocation("gPower"); @@ -216,8 +218,13 @@ public class SSAORenderer RenderUtil.getNearClipPlaneDistanceInBlocks(partialTicks), (float) ((RenderUtil.getFarClipPlaneDistanceInBlocks() + LodUtil.REGION_WIDTH) * Math.sqrt(2))); + Mat4f invertedPerspective = new Mat4f(perspective); + invertedPerspective.invert(); + + this.ssaoShader.bind(); this.ssaoShader.setUniform(this.ssaoShaderUniforms.gProjUniform, perspective); + this.ssaoShader.setUniform(this.ssaoShaderUniforms.gInvProjUniform, invertedPerspective); this.ssaoShader.setUniform(this.ssaoShaderUniforms.gSampleRadUniform, 3.0f); this.ssaoShader.setUniform(this.ssaoShaderUniforms.gFactorUniform, 0.8f); this.ssaoShader.setUniform(this.ssaoShaderUniforms.gPowerUniform, 1.0f); diff --git a/core/src/main/resources/shaders/ssao/ao.frag b/core/src/main/resources/shaders/ssao/ao.frag index 0e5501870..fc48bcc05 100644 --- a/core/src/main/resources/shaders/ssao/ao.frag +++ b/core/src/main/resources/shaders/ssao/ao.frag @@ -9,6 +9,7 @@ uniform float gSampleRad; uniform float gFactor; uniform float gPower; uniform mat4 gProj; +uniform mat4 gInvProj; const int MAX_KERNEL_SIZE = 128; const float INV_MAX_KERNEL_SIZE_F = 1.0 / float(MAX_KERNEL_SIZE); @@ -25,7 +26,7 @@ vec3 calcViewPosition(vec2 coords) { 1.0 ); - vec4 vs_pos = inverse(gProj) * ndc; + vec4 vs_pos = gInvProj * ndc; vs_pos.xyz = vs_pos.xyz / vs_pos.w; return vs_pos.xyz; }