From 56eba9bf69b3ea16b31006d697ece96a8670b2f7 Mon Sep 17 00:00:00 2001 From: Philipp Mildenberger Date: Wed, 22 Oct 2025 18:10:05 +0200 Subject: [PATCH 1/3] Support `logarithmicDepthBuffer` --- src/shaders/splatFragment.glsl | 13 +++++++++++++ src/shaders/splatVertex.glsl | 14 ++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/shaders/splatFragment.glsl b/src/shaders/splatFragment.glsl index 358ca57..76ed764 100644 --- a/src/shaders/splatFragment.glsl +++ b/src/shaders/splatFragment.glsl @@ -4,6 +4,9 @@ precision highp int; #include +#ifdef USE_LOGDEPTHBUF + uniform float logDepthBufFC; +#endif uniform float near; uniform float far; uniform bool encodeLinear; @@ -28,6 +31,10 @@ out vec4 fragColor; in vec4 vRgba; in vec2 vSplatUv; in vec3 vNdc; +#ifdef USE_LOGDEPTHBUF + in float vFragDepth; + in float vIsPerspective; +#endif flat in uint vSplatIndex; void main() { @@ -93,4 +100,10 @@ void main() { fragColor = rgba; #endif } + #ifdef USE_LOGDEPTHBUF + // Doing a strict comparison with == 1.0 can cause noise artifacts + // on some platforms. See issue https://github.com/mrdoob/three.js/issues/17623. + gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; + #endif + } diff --git a/src/shaders/splatVertex.glsl b/src/shaders/splatVertex.glsl index ad90d69..e7223c0 100644 --- a/src/shaders/splatVertex.glsl +++ b/src/shaders/splatVertex.glsl @@ -7,6 +7,10 @@ precision highp usampler2DArray; attribute uint splatIndex; +#ifdef USE_LOGDEPTHBUF + out float vFragDepth; + out float vIsPerspective; +#endif out vec4 vRgba; out vec2 vSplatUv; out vec3 vNdc; @@ -35,6 +39,12 @@ uniform float focalAdjustment; uniform usampler2DArray packedSplats; uniform vec4 rgbMinMaxLnScaleMinMax; +#ifdef USE_LOGDEPTHBUF + bool isPerspectiveMatrix( mat4 m ) { + return m[ 2 ][ 3 ] == - 1.0; + } +#endif + void main() { // Default to outside the frustum so it's discarded if we return early gl_Position = vec4(0.0, 0.0, 2.0, 1.0); @@ -215,4 +225,8 @@ void main() { vSplatUv = position.xy * maxStdDev; vNdc = ndc; gl_Position = vec4(ndc.xy * clipCenter.w, clipCenter.zw); + #ifdef USE_LOGDEPTHBUF + vFragDepth = 1.0 + gl_Position.w; + vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); + #endif } From 75229f004a5b00bd0bf44df530fcb3ac3c807c6b Mon Sep 17 00:00:00 2001 From: Philipp Mildenberger Date: Thu, 23 Oct 2025 16:28:04 +0200 Subject: [PATCH 2/3] Use `#include ` --- src/shaders/splatFragment.glsl | 6 +----- src/shaders/splatVertex.glsl | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/shaders/splatFragment.glsl b/src/shaders/splatFragment.glsl index 76ed764..27206f1 100644 --- a/src/shaders/splatFragment.glsl +++ b/src/shaders/splatFragment.glsl @@ -3,6 +3,7 @@ precision highp float; precision highp int; #include +#include #ifdef USE_LOGDEPTHBUF uniform float logDepthBufFC; @@ -31,10 +32,6 @@ out vec4 fragColor; in vec4 vRgba; in vec2 vSplatUv; in vec3 vNdc; -#ifdef USE_LOGDEPTHBUF - in float vFragDepth; - in float vIsPerspective; -#endif flat in uint vSplatIndex; void main() { @@ -105,5 +102,4 @@ void main() { // on some platforms. See issue https://github.com/mrdoob/three.js/issues/17623. gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; #endif - } diff --git a/src/shaders/splatVertex.glsl b/src/shaders/splatVertex.glsl index e7223c0..0cfdf56 100644 --- a/src/shaders/splatVertex.glsl +++ b/src/shaders/splatVertex.glsl @@ -4,13 +4,9 @@ precision highp int; precision highp usampler2DArray; #include +#include attribute uint splatIndex; - -#ifdef USE_LOGDEPTHBUF - out float vFragDepth; - out float vIsPerspective; -#endif out vec4 vRgba; out vec2 vSplatUv; out vec3 vNdc; From a2bf8a0203e0763fe36075d80805091286713ef8 Mon Sep 17 00:00:00 2001 From: Philipp Mildenberger Date: Thu, 23 Oct 2025 16:34:10 +0200 Subject: [PATCH 3/3] use includes everywhere if possible or reasonable --- src/shaders/splatFragment.glsl | 11 ++--------- src/shaders/splatVertex.glsl | 6 ++---- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/shaders/splatFragment.glsl b/src/shaders/splatFragment.glsl index 27206f1..0112ef3 100644 --- a/src/shaders/splatFragment.glsl +++ b/src/shaders/splatFragment.glsl @@ -3,11 +3,8 @@ precision highp float; precision highp int; #include -#include +#include -#ifdef USE_LOGDEPTHBUF - uniform float logDepthBufFC; -#endif uniform float near; uniform float far; uniform bool encodeLinear; @@ -97,9 +94,5 @@ void main() { fragColor = rgba; #endif } - #ifdef USE_LOGDEPTHBUF - // Doing a strict comparison with == 1.0 can cause noise artifacts - // on some platforms. See issue https://github.com/mrdoob/three.js/issues/17623. - gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; - #endif + #include } diff --git a/src/shaders/splatVertex.glsl b/src/shaders/splatVertex.glsl index 0cfdf56..61331f2 100644 --- a/src/shaders/splatVertex.glsl +++ b/src/shaders/splatVertex.glsl @@ -7,6 +7,7 @@ precision highp usampler2DArray; #include attribute uint splatIndex; + out vec4 vRgba; out vec2 vSplatUv; out vec3 vNdc; @@ -221,8 +222,5 @@ void main() { vSplatUv = position.xy * maxStdDev; vNdc = ndc; gl_Position = vec4(ndc.xy * clipCenter.w, clipCenter.zw); - #ifdef USE_LOGDEPTHBUF - vFragDepth = 1.0 + gl_Position.w; - vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); - #endif + #include }