Mirrors the GLSL GSplatMaterial wrapper one-for-one — same
constructor signature (GSplatMaterialConfig), same update
methods (opacity / gamma / intensity / offset / truncationRadius
/ maxExtentFactor / colormapTexture / scalarRange), same
applyBlendingMode + clone semantics, same
CameraAwareMaterial / ColormapAwareMaterial interfaces.
GSplat-specific behaviours:
applyBlendingMode selects the projection model: PEAK
(2D-projected) for surface modes (max/normal/opaque —
usesPeakProjection), SUM (ray-integral) for emissive
(additive/luminous/volumetric). In TSL
the graph JS-branches on the mode at build time; the
uProjectionMode uniform is decorative (clone/telemetry
parity). The GLSL twin drives the same split via the uniform.
Blending state is fully unified with the GLSL wrapper: the
shared getCompleteBlendingState for additive / luminous /
max / opaque (AdditiveBlending's SrcAlpha factor is identity
under the shader's alpha = 1.0 contract) and
getGSplatNormalBlendingState for normal (premultiplied
coverage alpha). No separate alpha-channel blend state
anywhere — it trips gl.getError() under the WebGPU→WebGL2
bridge, and its historical overflow-guard purpose is now
handled by the raw-scene-hdr capture sanitization.
Mechanics identical to PointTSLMaterial for the
uniforms-by-reference binding pattern.
TSL / NodeMaterial counterpart to
GSplatMaterial.Mirrors the GLSL
GSplatMaterialwrapper one-for-one — same constructor signature (GSplatMaterialConfig), same update methods (opacity / gamma / intensity / offset / truncationRadius / maxExtentFactor / colormapTexture / scalarRange), sameapplyBlendingMode+clonesemantics, sameCameraAwareMaterial/ColormapAwareMaterialinterfaces.GSplat-specific behaviours:
applyBlendingModeselects the projection model: PEAK (2D-projected) for surface modes (max/normal/opaque —usesPeakProjection), SUM (ray-integral) for emissive (additive/luminous/volumetric). In TSL the graph JS-branches on the mode at build time; theuProjectionModeuniform is decorative (clone/telemetry parity). The GLSL twin drives the same split via the uniform.getCompleteBlendingStatefor additive / luminous / max / opaque (AdditiveBlending's SrcAlpha factor is identity under the shader's alpha = 1.0 contract) andgetGSplatNormalBlendingStatefornormal(premultiplied coverage alpha). No separate alpha-channel blend state anywhere — it trips gl.getError() under the WebGPU→WebGL2 bridge, and its historical overflow-guard purpose is now handled by the raw-scene-hdr capture sanitization.Mechanics identical to
PointTSLMaterialfor the uniforms-by-reference binding pattern.