@@ -70,7 +70,9 @@ export class ReadbackSplatSorter implements SplatSorter {
7070
7171 private capacity = 0 ;
7272 private target ?: THREE . WebGLArrayRenderTarget ;
73- private readbackBufferPool : ReadbackBufferPool ;
73+ private readonly readbackBufferPool : ReadbackBufferPool ;
74+
75+ private readonly material : THREE . RawShaderMaterial ;
7476
7577 constructor ( options : ReadbackSorterOptions = { } ) {
7678 this . sortRadial = options . sortRadial ?? false ;
@@ -79,6 +81,7 @@ export class ReadbackSplatSorter implements SplatSorter {
7981 this . sort32 = options . sort32 ?? false ;
8082
8183 this . readbackBufferPool = new ReadbackBufferPool ( ) ;
84+ this . material = ReadbackSplatSorter . createMaterial ( ) ;
8285 }
8386
8487 async sort (
@@ -92,16 +95,6 @@ export class ReadbackSplatSorter implements SplatSorter {
9295 const maxSplats = splatData . maxSplats ;
9396 const numSplats = splatData . numSplats ;
9497
95- const material = this . createMaterial ( splatData ) ;
96- material . uniforms . sortRadial . value = this . sortRadial ;
97- material . uniforms . sortDepthBias . value = this . depthBias ;
98- material . uniforms . sort360 . value = this . sort360 ;
99- material . uniforms . splatModelViewMatrix . value . multiplyMatrices (
100- camera . matrixWorldInverse ,
101- splat . matrixWorld ,
102- ) ;
103- material . defines . SORT32 = this . sort32 ;
104-
10598 // Render
10699 const count = this . sort32 ? numSplats : numSplats / 2 ;
107100 const readbackBuffer = await this . ensureCapacity ( count ) ;
@@ -111,6 +104,17 @@ export class ReadbackSplatSorter implements SplatSorter {
111104
112105 const renderState = this . saveRenderState ( renderer ) ;
113106
107+ const material = this . material ;
108+ splatData . setupMaterial ( material ) ;
109+ material . uniforms . sortRadial . value = this . sortRadial ;
110+ material . uniforms . sortDepthBias . value = this . depthBias ;
111+ material . uniforms . sort360 . value = this . sort360 ;
112+ material . uniforms . splatModelViewMatrix . value . multiplyMatrices (
113+ camera . matrixWorldInverse ,
114+ splat . matrixWorld ,
115+ ) ;
116+ material . defines . SORT32 = this . sort32 ;
117+
114118 this . render ( renderer , count , material ) ;
115119 const promise = this . read ( renderer , count , readback ) ;
116120
@@ -293,7 +297,7 @@ export class ReadbackSplatSorter implements SplatSorter {
293297 return Promise . all ( promises ) . then ( ( ) => readback ) ;
294298 }
295299
296- private createMaterial ( splatData : SplatData ) {
300+ private static createMaterial ( ) {
297301 const shaders = getShaders ( ) ;
298302 const material = new THREE . RawShaderMaterial ( {
299303 name : "SplatDistanceShader" ,
@@ -313,8 +317,6 @@ export class ReadbackSplatSorter implements SplatSorter {
313317 fragmentShader : shaders . splatDistanceFragment ,
314318 } ) ;
315319
316- splatData . setupMaterial ( material ) ;
317-
318320 return material ;
319321 }
320322
0 commit comments