From 4312472534fa7cd6e85a44417fff5a18aa64281c Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Sun, 1 Dec 2024 23:35:25 +1000 Subject: [PATCH] fixed/greatly improved hiz culling maybe --- .../HierarchicalOcclusionTraverser.java | 4 +++- .../shaders/lod/hierarchical/screenspace.glsl | 20 +++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/hierachical2/HierarchicalOcclusionTraverser.java b/src/main/java/me/cortex/voxy/client/core/rendering/hierachical2/HierarchicalOcclusionTraverser.java index 27d7b538..619fbf65 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/hierachical2/HierarchicalOcclusionTraverser.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/hierachical2/HierarchicalOcclusionTraverser.java @@ -115,8 +115,10 @@ public class HierarchicalOcclusionTraverser { MemoryUtil.memPutInt(ptr, (int) (this.renderList.size()/4-1)); ptr += 4; + + final float screenspaceAreaDecreasingSize = 100 * 100; //Screen space size for descending - MemoryUtil.memPutFloat(ptr, 100*100); ptr += 4; + MemoryUtil.memPutFloat(ptr, (float) (screenspaceAreaDecreasingSize) /(viewport.width*viewport.height)); ptr += 4; } private void bindings() { diff --git a/src/main/resources/assets/voxy/shaders/lod/hierarchical/screenspace.glsl b/src/main/resources/assets/voxy/shaders/lod/hierarchical/screenspace.glsl index 45c59dd2..ef63baa3 100644 --- a/src/main/resources/assets/voxy/shaders/lod/hierarchical/screenspace.glsl +++ b/src/main/resources/assets/voxy/shaders/lod/hierarchical/screenspace.glsl @@ -63,25 +63,33 @@ void setupScreenspace(in UnpackedNode node) { //printf("Screenspace MIN: %f, %f, %f MAX: %f, %f, %f", minBB.x,minBB.y,minBB.z, maxBB.x,maxBB.y,maxBB.z); //Convert to screenspace - maxBB = maxBB*0.5f+0.5f; - minBB = minBB*0.5f+0.5f; + maxBB.xy = maxBB.xy*0.5f+0.5f; + minBB.xy = minBB.xy*0.5f+0.5f; - size = clamp(maxBB.xy - minBB.xy, vec2(0), vec2(1));//We half it for implicit conversion to screenspace + size = clamp(maxBB.xy - minBB.xy, vec2(0), vec2(1)); } //Checks if the node is implicitly culled (outside frustum) bool outsideFrustum() { return any(lessThanEqual(maxBB, vec3(0.0f, 0.0f, 0.0f))) || any(lessThanEqual(vec3(1.0f, 1.0f, 1.0f), minBB)); + + //|| any(lessThanEqual(minBB, vec3(0.0f, 0.0f, 0.0f))) || any(lessThanEqual(vec3(1.0f, 1.0f, 1.0f), maxBB)); } bool isCulledByHiz() { - if (minBB.z < 0) {//Minpoint is behind the camera, its always going to pass + //if (minBB.z < 0) {//Minpoint is behind the camera, its always going to pass + // return false;//Just cull it for now cause other culling isnt working, TODO: FIXME + //} + if (maxBB.z > 1) { return false; } - vec2 ssize = size.xy * vec2(screenW, screenH); + + vec2 ssize = size * vec2(screenW, screenH); float miplevel = ceil(log2(max(max(ssize.x, ssize.y),1))); vec2 midpoint = (maxBB.xy + minBB.xy)*0.5f; + //TODO: maybe get rid of clamp + midpoint = clamp(midpoint, vec2(0), vec2(1)); bool culled = textureLod(hizDepthSampler, vec3(midpoint, minBB.z), miplevel) < 0.0001f; if (culled) { @@ -93,5 +101,5 @@ bool isCulledByHiz() { //Returns if we should decend into its children or not bool shouldDecend() { //printf("Screen area %f: %f, %f", (size.x*size.y*float(screenW)*float(screenH)), float(size.x), float(size.y)); - return (size.x*size.y*screenW*screenH) > minSSS; + return (size.x*size.y) > minSSS; } \ No newline at end of file