11import { Debug } from '../../core/debug.js' ;
2- import { ADDRESS_CLAMP_TO_EDGE , FILTER_NEAREST , PIXELFORMAT_R32U , PIXELFORMAT_RGBA16F , PIXELFORMAT_RGBA32U , PIXELFORMAT_RG32U , BUFFERUSAGE_COPY_DST } from '../../platform/graphics/constants.js' ;
2+ import { ADDRESS_CLAMP_TO_EDGE , FILTER_NEAREST , PIXELFORMAT_R32U , PIXELFORMAT_RGBA16F , PIXELFORMAT_RGBA32U , PIXELFORMAT_RG32U , BUFFERUSAGE_COPY_DST , SEMANTIC_POSITION } from '../../platform/graphics/constants.js' ;
33import { RenderTarget } from '../../platform/graphics/render-target.js' ;
44import { StorageBuffer } from '../../platform/graphics/storage-buffer.js' ;
55import { Texture } from '../../platform/graphics/texture.js' ;
66import { UploadStream } from '../../platform/graphics/upload-stream.js' ;
7+ import { QuadRender } from '../graphics/quad-render.js' ;
8+ import { ShaderUtils } from '../shader-lib/shader-utils.js' ;
9+ import glslGsplatCopyToWorkBufferPS from '../shader-lib/glsl/chunks/gsplat/frag/gsplatCopyToWorkbuffer.js' ;
10+ import wgslGsplatCopyToWorkBufferPS from '../shader-lib/wgsl/chunks/gsplat/frag/gsplatCopyToWorkbuffer.js' ;
711import { GSplatWorkBufferRenderPass } from './gsplat-work-buffer-render-pass.js' ;
812
913let id = 0 ;
@@ -12,8 +16,46 @@ let id = 0;
1216 * @import { GSplatInfo } from "./gsplat-info.js"
1317 * @import { GraphicsDevice } from '../../platform/graphics/graphics-device.js'
1418 * @import { GraphNode } from '../graph-node.js';
19+ * @import { ShaderMaterial } from '../materials/shader-material.js'
1520 */
1621
22+ /**
23+ * A helper class to cache quad renders for work buffer rendering.
24+ *
25+ * @ignore
26+ */
27+ class WorkBufferRenderInfo {
28+ /** @type {ShaderMaterial } */
29+ material ;
30+
31+ /** @type {QuadRender } */
32+ quadRender ;
33+
34+ constructor ( device , key , material ) {
35+ this . device = device ;
36+ this . material = material ;
37+
38+ const clonedDefines = new Map ( material . defines ) ;
39+ const shader = ShaderUtils . createShader ( this . device , {
40+ uniqueName : `SplatCopyToWorkBuffer:${ key } ` ,
41+ attributes : { vertex_position : SEMANTIC_POSITION } ,
42+ vertexDefines : clonedDefines ,
43+ fragmentDefines : clonedDefines ,
44+ vertexChunk : 'fullscreenQuadVS' ,
45+ fragmentGLSL : glslGsplatCopyToWorkBufferPS ,
46+ fragmentWGSL : wgslGsplatCopyToWorkBufferPS ,
47+ fragmentOutputTypes : [ 'vec4' , 'uvec4' , 'uvec2' ]
48+ } ) ;
49+
50+ this . quadRender = new QuadRender ( shader ) ;
51+ }
52+
53+ destroy ( ) {
54+ this . material ?. destroy ( ) ;
55+ this . quadRender ?. destroy ( ) ;
56+ }
57+ }
58+
1759/**
1860 * @ignore
1961 */
@@ -155,4 +197,4 @@ class GSplatWorkBuffer {
155197 }
156198}
157199
158- export { GSplatWorkBuffer } ;
200+ export { GSplatWorkBuffer , WorkBufferRenderInfo } ;
0 commit comments