From 8265cff34fc8adf92fded285282c36974de54a04 Mon Sep 17 00:00:00 2001 From: Untold Engine Date: Sun, 9 Aug 2026 22:27:17 -0700 Subject: [PATCH 1/3] [Patch] Reduce Gaussian splat fragment-shading overdraw --- Sources/UntoldEngine/Shaders/Gaussians.metal | 78 ++++++++++++------ .../UntoldEngineKernels-ios.air | Bin 164768 -> 164816 bytes .../UntoldEngineKernels-ios.metallib | Bin 547151 -> 547183 bytes .../UntoldEngineKernels-iossim.metallib | Bin 549695 -> 549743 bytes .../UntoldEngineKernels-tvos.air | Bin 164768 -> 164816 bytes .../UntoldEngineKernels-tvos.metallib | Bin 547471 -> 547503 bytes .../UntoldEngineKernels-tvossim.air | Bin 164800 -> 164848 bytes .../UntoldEngineKernels-tvossim.metallib | Bin 549999 -> 550047 bytes .../UntoldEngineKernels-xros.air | Bin 164768 -> 164816 bytes .../UntoldEngineKernels-xros.metallib | Bin 547503 -> 547535 bytes .../UntoldEngineKernels-xrossim.air | Bin 164800 -> 164848 bytes .../UntoldEngineKernels-xrossim.metallib | Bin 550031 -> 550079 bytes .../UntoldEngineKernels.metallib | Bin 545439 -> 545471 bytes 13 files changed, 51 insertions(+), 27 deletions(-) diff --git a/Sources/UntoldEngine/Shaders/Gaussians.metal b/Sources/UntoldEngine/Shaders/Gaussians.metal index d3500f195..0b505a996 100644 --- a/Sources/UntoldEngine/Shaders/Gaussians.metal +++ b/Sources/UntoldEngine/Shaders/Gaussians.metal @@ -33,6 +33,14 @@ constant float GAUSSIAN_SH_C3[7] = { -0.5900435899266435f }; +// Hard ceiling on a splat's screen-space half-extent, in pixels. Without this, radius +// grows roughly as 1/distance as the camera approaches a splat (see the Jacobian in +// computeCov2D), so a single splat can balloon to cover a huge fraction of the screen at +// close range — every one of those extra pixels pays full fragment-shading cost. Trades a +// little softness/tail accuracy at extreme close range for a bounded worst-case overdraw +// cost per splat. +constant float kGaussianMaxScreenRadius = 128.0f; + inline uint unpackIndex(uint64_t packed) { return (uint)(packed & 0xffffffffu); } inline uint unpackDepthKey(uint64_t packed) { return (uint)(packed >> 32); } @@ -190,9 +198,9 @@ float3 computeCov2D(float4 splatCenter, return float3(cov[0][0], cov[0][1], cov[1][1]); } -// Compute inverse covariance and a scalar radius (~3σ) in pixels +// Compute inverse covariance and a per-axis screen-space half-extent (~3σ) in pixels float3 computeInverseCovarianceConic(float3 cov2D, - thread float &radius, + thread float2 &radius, thread bool &valid) { float a = cov2D.x; @@ -202,7 +210,7 @@ float3 computeInverseCovarianceConic(float3 cov2D, float det = a * c - b * b; if (det == 0.0f) { valid = false; - radius = 0.0f; + radius = float2(0.0f); return float3(0.0f); } @@ -214,14 +222,17 @@ float3 computeInverseCovarianceConic(float3 cov2D, a * detInv ); - // Eigenvalues of the 2×2 covariance - float mid = 0.5f * (a + c); - float disc = max(0.1f, mid * mid - det); - float lambda1 = mid + sqrt(disc); - float lambda2 = mid - sqrt(disc); - - // Radius in pixels covering ~3σ of the larger axis - radius = ceil(3.0f * sqrt(max(lambda1, lambda2))); + // Tight axis-aligned half-extent covering ~3σ along each screen axis independently. + // This is the *exact* per-axis extent of the ellipse {d : dᵀ·conic·d <= 9} — it depends + // only on cov2D's diagonal (a, c), not its off-diagonal correlation term (b), regardless + // of how the ellipse is rotated. That makes it strictly tighter than (or equal to) the + // previous square sized by the larger eigenvalue: an anisotropic splat (e.g. a thin, + // flat-surface splat) no longer forces both screen axes out to the size of its longest + // axis, so fewer wasted fragments get rasterized, shaded, and discarded. + radius = float2( + min(ceil(3.0f * sqrt(a)), kGaussianMaxScreenRadius), + min(ceil(3.0f * sqrt(c)), kGaussianMaxScreenRadius) + ); valid = true; return conic; @@ -326,11 +337,11 @@ vertex GaussianOutData vertexGaussianTBDRShader( uniforms.projectionMatrix, viewport); - float extent = 0.0f; + float2 extent = float2(0.0f); bool valid = true; out.conic = computeInverseCovarianceConic(cov2D, extent, valid); - if (!valid || extent <= 0.0f) { + if (!valid || extent.x <= 0.0f || extent.y <= 0.0f) { return out; } @@ -362,6 +373,32 @@ fragment GaussianTBDRFragmentStore fragmentGaussianTBDRShader( discard_fragment(); } + // Early-terminate once this pixel is effectively opaque: every splat still to come in + // sorted order would contribute (1 - accumulatedAlpha) ~ 0 regardless of its own color + // or occlusion, so there's no need to pay for the opaque-depth read or the power/exp + // blend math below. This is the same "early stop" reference Gaussian-splat rasterizers + // use per-pixel, and is what keeps heavily overlapping splats (close-range viewing) + // from each paying full shading cost for zero visible contribution. + if (previousValues.color.a >= half(0.999h)) { + out.values = previousValues; + return out; + } + + // Evaluate the Gaussian falloff before touching the opaque-depth texture: this is pure + // ALU (no memory fetch), and most of a splat's rasterized area — out near the 3σ quad + // edge — has negligible alpha. Rejecting those tail fragments here means they never pay + // for the depth-texture read at all, on top of never reaching the blend math below. + const float projYSign = 1.0f; + float2 d = calcScreenSpaceDelta(in.position.xy, in.coordxy, projYSign); + float power = calcPowerFromConic(in.conic, d); + + half alpha = half(saturate(in.alpha * exp(power))); + if (alpha < half(1.0f / 255.0f)) { + // Contribution rounds to nothing — skip the opaque-depth read and blend math below. + out.values = previousValues; + return out; + } + // Occlude against opaque geometry already in the depth buffer (a snapshot taken // before this pass — see gaussianExecution). in.position.z is already normalized // device depth from the same projection the opaque pass used, so it's directly @@ -376,24 +413,11 @@ fragment GaussianTBDRFragmentStore fragmentGaussianTBDRShader( ? (splatDepth + depthBias < storedOpaqueDepth) : (splatDepth > storedOpaqueDepth + depthBias); if (occludedByOpaque) { - // discard_fragment() only suppresses standard color/depth attachment writes — - // it does NOT stop this function from computing and returning a value for the - // custom imageblock struct below, so relying on it alone here would let an - // occluded splat's contribution reach the accumulator anyway. Return the - // accumulator unchanged instead, so an occluded splat contributes nothing. + // Return the accumulator unchanged so an occluded splat contributes nothing. out.values = previousValues; return out; } - const float projYSign = 1.0f; - float2 d = calcScreenSpaceDelta(in.position.xy, in.coordxy, projYSign); - float power = calcPowerFromConic(in.conic, d); - - half alpha = half(saturate(in.alpha * exp(power))); - if (alpha < half(1.0f / 255.0f)) { - discard_fragment(); - } - half oneMinusAccumulatedAlpha = half(1.0h - previousValues.color.a); half4 colorWithPremultipliedAlpha = half4(half3(in.color) * alpha, alpha); diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-ios.air b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-ios.air index c0ab4b40f7bd973021b9f09841925c1a9a4ccbd5..f754046edcd1ef27d774a70db10137029424afd3 100644 GIT binary patch delta 11783 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 delta 11635 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�NBY>962)+LHOkZR-RGMP=}*KjtJNF&(R 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 delta 3594 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 diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-iossim.metallib b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-iossim.metallib index 359da21ea74abb8fbf15af6b62dfe27d2292eb76..114d2449b0dbda2665444dff707be68cd8f301e5 100644 GIT binary patch delta 3645 zcmYjT3se(V8oo1=OeP_L34#t1%!G$TN@W5K5B=>jYF-wQh9l7VRtA*1oJ8?JMoFuy+RBcFy_d|Gw}4 z?|<)|J2UqlJ8Aj%NsDn&?Ls>OP@n~%bt+JU4ZDmLNbJy(y0qNj6oTn+El*l|&ksGX z6Njc9e6Vc&u)X-6_b)76elB%E%A%^fmk}T$M$%qKBL>l!PKlwZ8&EPG!Y9#Ko}vU& zNbzL)N)*igKV4*6i83_`T}P4Pd!`jgK(u89(B9RGNY6+Xzs*>I#vWGabwnqwo7RXj z9SV(QCI^SEVMg(%j6{((SE2N?P|ppu^_l+raDR7XHFE8a;s4H2TJ1j{0LFV z<&h>an!5*ULe!!sX^I%IZo=5qaZJxxk1%4_j5dtDYg~yLbYgkl8jL-3D?3?? zbX;jI$LnregGING^IQFVdmE26b&hMVkvef>{yIbwKgr*Xx&J(_%JbZJy9<*}{K^Yv zy0E~9<6NHUv6(Bd$XCBssVG>7l3J0QMTznJN#ezVMwHG}==g&m#C6PrXj7RYU1uIc z-Mj+x;bYoqTaU7jC{*rxdLfAc0W??{|IublbwPwg`|9Q_4nu8uZzU}LlP*nis6 z@b>t-=N8u$W}v-ZrRj@>9+U|x(4p6f^NJosqT->VPL%u$6kE}d1YMr^{j8NJe@RJ` z=drDL1seHQp%ViQwl@%|;)V>3I10^LQia6~g#1K({*qRI3DV~;LDey|cZS$u&qR9r zdZ%Nx#B>`#SpWbD4FJh)dHSI$GYP*d;8qlX>tETP^-D0X04qgS^*IZ$BMAmK3{O(k z`*>e?2pm!Pu}~YLx0! z0Kl~P9h&-t*ZG9E*nU|hq`Jy8zHQe}%pU&Y_cG`xKDsUc(jPw1xyQaFi(z?Tq`dp51 zQ>9zOGpCzWVZ+wY%Cx1Hh+5Zj{^|Nu|Hcrou1s6j!)SCZ55LlscxMAoT8PP`8}T2= zGqyVJcc$A8V88GEjs7##$#7otfdlGon_C}=XmsB5Jy#~jEg9!MW-D=u9thzF-GZGS z&B)t?WMAsZaCy8TeW7VXL}yi9>EaL=kb1H|i0yKCAvg=ni!@5wuW;SDs*sl4qq4Cm?5QdP8Kh?nf;d~~8z_Tg9})ufcl z$g9b`{qg?kH^+PKYf7Tt^1$BoZ@QDHBQi>PE09DTkdf(~P!jc=jCKoX!3egOle>92 znm~J&%jgx5Xz@7c(W5ERE)OR!zpjEIG#E4}>&(+53s(LI5!d z*LtSMlF%E2JQ(Br8;4q-mF^^tn_I!i62k~LvV@QXy=BT;r#?LSJbJ&K7S?J#BZH*w zBdU@aMt8U&4)jSpEtE^babU5N`6DmrkNXI+@;7|QM?7U~Svx!OhW5rF9D+@iSU{dv zuvW-6-Q4F4w6non4x27~4SOSKJBg=;CvJ`>v#YLB-jT|<}S?CS3OWJWhDx*P*{76@_hEJp{QZS)0vn!^)KqfWINu=gq zRvC>aJ-oT&J1G|?333*rxmc5Q1jY`MLW(T#tsgWhf>NG@9buJ43~+`szBv)Cvb2LF=?L?4;L_HIjQX!JxQJ9bXNSEB zsvC1H#MtFFsRAAAUPb%Ce=BK0pLk=RGt|Z3qep~n6k-ZxxB=r>8Ezp&BjzKx-dI=H zy|li%YGkfnpQ#G>SG==aTdhx2;7R&EH2E24Z&&Ev>RZtj&oHdYT>rGcyvhm!WycQd~8)|W@uM`#s2iG*+);3y0WxR zV*QJ;uCMTNt^a=f1;X(=wra!%jIqIJ?s2p4t`Xap+M9!Xz9a-JwDAtOsKfn>YHC}& zqsEr8HqX-IbX|PzeFgui&wHsbGu$SGxfZAlZYtn9ct_TiE_;W&0x!-S&B8TCFMrvb zeoR$dXj<}K&1LgHjXTKbV7|xZFxIK9Ml2Ow5;tzVa4?o1wndEH$vm|`Mc+)ksQS{w z%@4D!{Cv>Ry_AXAqDC+ipQgq#!0kw>E9zh(oI6#b_|!8crf3^-rbOjuJ|L-qwUs=1 z*x*?r3x_yX-*;aXhGF1Rf5QK)9fCfOL6gZU=N+jfFtfH`(zjhAiK}dMSo;VV?@tU=y z^;8W20W~}b00Xqb;P}n{U zBkVaHbg4wxiy?cDu-^k+U&?vSvnYQ67MrA+s~jy-A+CKF1d8_nRTik-!x?vjXR<)^ zS+3^ELOctob{gZyimF-fAcYWfQg-42raE@^MeQc#)Im?2I*zdejlft0YIow1qN%}z z3z|#96lSkmeOPY~bx>qA;YFySaK4A}(+dZTo&mUT4Dc$SzJXssJ$|{uPvfg$=s5)U z#=9)Lxe~v_MZs-0Ov9~aja1LJSKvG1PB;7xo`^en=(^)w6g8Ld?hu+^BKatOrJ{j1 z$%lb+J@x?7G+-1w6gg@;&6D9aZet5gt$ob_2U0_LxvRP?d_l68ZwlK@s+Z{_h}GTS zXa_qj*SPeEDZl=xrAf_5m-UiRnrS7**enA?{e)_)dp+TA*b}y*%|073X2d>~|2au* zQ|$Gfh#_=0x*YNYo60k|g$=>Px# delta 3598 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 Yu=p&M-g1_*1<&3@6?MLQmfFAZ|7juVDF6Tf diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvos.air b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvos.air index efed062af38d5575437c9efa61c32a0314e59624..8c4ed9b01d295c9351bd1aae57c74a97b5fdb87a 100644 GIT binary patch delta 11768 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 diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvos.metallib b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvos.metallib index b1e402ead6628329b8b0e5aab0fbed48b203c8da..717bb8c08fb3d3de5f39d495f8ee997814146ca5 100644 GIT binary patch delta 3648 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 aIDg(bMY=x}R9O6*6BM?N1LqXP=Klj>OXIcx diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvossim.air b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvossim.air index a49a9a7f9c6915b4e9902954969e86682b768644..f2ce1e4379865dd51290035bc29c00a6b87568dd 100644 GIT binary patch delta 11787 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 diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xros.air b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xros.air index a4b68449cf4bab53132017838626d28ee6053706..319a8ed90099157281d71c456e7c662b003a0033 100644 GIT binary patch delta 11768 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 diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xros.metallib b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xros.metallib index 02e17e6777b00423986f1570e99f27b405bb30ff..8003cbe32c75ec4d14ee95fec9138b96d4d65885 100644 GIT binary patch delta 3648 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 KZKK5Ow*LXNmJd__ delta 3592 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 delta 3631 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 B@R9%k From aa3acd80ef04ca3b037e4ecceb68123096ab4c74 Mon Sep 17 00:00:00 2001 From: Untold Engine Date: Sun, 9 Aug 2026 22:27:38 -0700 Subject: [PATCH 2/3] [Patch] Cull negligible-opacity Gaussian splats at load time --- Sources/UntoldEngine/Utils/PLYReader.swift | 64 ++++++++++++++++++++-- 1 file changed, 58 insertions(+), 6 deletions(-) diff --git a/Sources/UntoldEngine/Utils/PLYReader.swift b/Sources/UntoldEngine/Utils/PLYReader.swift index 4c98f7540..dc583df27 100644 --- a/Sources/UntoldEngine/Utils/PLYReader.swift +++ b/Sources/UntoldEngine/Utils/PLYReader.swift @@ -99,19 +99,71 @@ public class PLYReader { parsed = try parseBinaryGaussians(data: data, bodyOffset: bodyOffset, element: vertexElement, bigEndian: true, shSchema: shSchema) } + if let shSchema, + parsed.1.count != vertexElement.count * shSchema.coefficientsPerSplat + { + throw PLYError.invalidData("Spherical-harmonic coefficient data is incomplete") + } + + let (filteredSplats, filteredCoefficients) = filterNegligibleOpacitySplats( + splats: parsed.0, + shCoefficients: parsed.1, + coefficientsPerSplat: shSchema?.coefficientsPerSplat ?? 0 + ) + let sphericalHarmonics = shSchema.map { GaussianSphericalHarmonics( degree: $0.degree, coefficientsPerChannel: $0.coefficientsPerChannel, - coefficients: parsed.1 + coefficients: filteredCoefficients ) } - if let shSchema, - parsed.1.count != vertexElement.count * shSchema.coefficientsPerSplat - { - throw PLYError.invalidData("Spherical-harmonic coefficient data is incomplete") + return GaussianSplatAsset(splats: filteredSplats, sphericalHarmonics: sphericalHarmonics) + } + + // A splat's peak alpha (at its own center, where the Gaussian falloff is 1) equals its + // opacity — see fragmentGaussianTBDRShader's `alpha = opacity * exp(power)`, power <= 0. + // The shader itself discards any fragment below this same threshold, so a splat whose + // opacity never reaches it can never contribute a visible pixel anywhere in its extent. + // Dropping it here removes it from vertex shading, rasterization, and per-fragment ALU + // entirely instead of paying that cost every frame only to discard the result — this is + // a lossless cull (identical rendered image), not a quality/perf tradeoff. + private static let minRetainedOpacity: Float = 1.0 / 255.0 + + private static func filterNegligibleOpacitySplats( + splats: [GaussianSplat], + shCoefficients: [Float], + coefficientsPerSplat: Int + ) -> ([GaussianSplat], [Float]) { + guard splats.contains(where: { $0.opacity < minRetainedOpacity }) else { + return (splats, shCoefficients) } - return GaussianSplatAsset(splats: parsed.0, sphericalHarmonics: sphericalHarmonics) + + var keptSplats: [GaussianSplat] = [] + keptSplats.reserveCapacity(splats.count) + var keptCoefficients: [Float] = [] + if coefficientsPerSplat > 0 { + keptCoefficients.reserveCapacity(shCoefficients.count) + } + + for (index, splat) in splats.enumerated() { + guard splat.opacity >= minRetainedOpacity else { continue } + keptSplats.append(splat) + if coefficientsPerSplat > 0 { + let start = index * coefficientsPerSplat + keptCoefficients.append(contentsOf: shCoefficients[start ..< start + coefficientsPerSplat]) + } + } + + Logger.log( + message: String( + format: "[Gaussian][PLY] Culled %d/%d splats below visibility threshold (opacity < %.4f)", + splats.count - keptSplats.count, splats.count, minRetainedOpacity + ), + category: LogCategory.gaussian.rawValue + ) + + return (keptSplats, keptCoefficients) } // MARK: - Header Parsing From 934910c639c1de73f1d015f89969f055e633ff0b Mon Sep 17 00:00:00 2001 From: Untold Engine Date: Sun, 9 Aug 2026 22:50:27 -0700 Subject: [PATCH 3/3] [CI] Fixed formatting --- Sources/UntoldEngine/Utils/PLYReader.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/UntoldEngine/Utils/PLYReader.swift b/Sources/UntoldEngine/Utils/PLYReader.swift index dc583df27..7022f8877 100644 --- a/Sources/UntoldEngine/Utils/PLYReader.swift +++ b/Sources/UntoldEngine/Utils/PLYReader.swift @@ -121,13 +121,13 @@ public class PLYReader { return GaussianSplatAsset(splats: filteredSplats, sphericalHarmonics: sphericalHarmonics) } - // A splat's peak alpha (at its own center, where the Gaussian falloff is 1) equals its - // opacity — see fragmentGaussianTBDRShader's `alpha = opacity * exp(power)`, power <= 0. - // The shader itself discards any fragment below this same threshold, so a splat whose - // opacity never reaches it can never contribute a visible pixel anywhere in its extent. - // Dropping it here removes it from vertex shading, rasterization, and per-fragment ALU - // entirely instead of paying that cost every frame only to discard the result — this is - // a lossless cull (identical rendered image), not a quality/perf tradeoff. + /// A splat's peak alpha (at its own center, where the Gaussian falloff is 1) equals its + /// opacity — see fragmentGaussianTBDRShader's `alpha = opacity * exp(power)`, power <= 0. + /// The shader itself discards any fragment below this same threshold, so a splat whose + /// opacity never reaches it can never contribute a visible pixel anywhere in its extent. + /// Dropping it here removes it from vertex shading, rasterization, and per-fragment ALU + /// entirely instead of paying that cost every frame only to discard the result — this is + /// a lossless cull (identical rendered image), not a quality/perf tradeoff. private static let minRetainedOpacity: Float = 1.0 / 255.0 private static func filterNegligibleOpacitySplats(