Skip to content

Commit a002b5b

Browse files
mvaligurskyMartin Valigursky
andauthored
Small rendering to work buffer refactor for unified gsplats (#8091)
Co-authored-by: Martin Valigursky <mvaligursky@snapchat.com>
1 parent af0cc31 commit a002b5b

File tree

2 files changed

+46
-44
lines changed

2 files changed

+46
-44
lines changed

src/scene/gsplat-unified/gsplat-work-buffer.js

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import { 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';
33
import { RenderTarget } from '../../platform/graphics/render-target.js';
44
import { StorageBuffer } from '../../platform/graphics/storage-buffer.js';
55
import { Texture } from '../../platform/graphics/texture.js';
66
import { 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';
711
import { GSplatWorkBufferRenderPass } from './gsplat-work-buffer-render-pass.js';
812

913
let 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 };

src/scene/gsplat/gsplat-resource-base.js

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
import { Debug } from '../../core/debug.js';
22
import { Vec2 } from '../../core/math/vec2.js';
33
import { BoundingBox } from '../../core/shape/bounding-box.js';
4-
import { ADDRESS_CLAMP_TO_EDGE, BUFFER_STATIC, FILTER_NEAREST, SEMANTIC_ATTR13, SEMANTIC_POSITION, TYPE_UINT32 } from '../../platform/graphics/constants.js';
4+
import { ADDRESS_CLAMP_TO_EDGE, BUFFER_STATIC, FILTER_NEAREST, SEMANTIC_ATTR13, TYPE_UINT32 } from '../../platform/graphics/constants.js';
55
import { Texture } from '../../platform/graphics/texture.js';
66
import { VertexFormat } from '../../platform/graphics/vertex-format.js';
77
import { VertexBuffer } from '../../platform/graphics/vertex-buffer.js';
88
import { Mesh } from '../mesh.js';
99
import { ShaderMaterial } from '../materials/shader-material.js';
10-
import { QuadRender } from '../graphics/quad-render.js';
11-
import { ShaderUtils } from '../shader-lib/shader-utils.js';
12-
import glslGsplatCopyToWorkBufferPS from '../shader-lib/glsl/chunks/gsplat/frag/gsplatCopyToWorkbuffer.js';
13-
import wgslGsplatCopyToWorkBufferPS from '../shader-lib/wgsl/chunks/gsplat/frag/gsplatCopyToWorkbuffer.js';
10+
import { WorkBufferRenderInfo } from '../gsplat-unified/gsplat-work-buffer.js';
1411

1512
/**
1613
* @import { GraphicsDevice } from '../../platform/graphics/graphics-device.js'
@@ -22,43 +19,6 @@ import wgslGsplatCopyToWorkBufferPS from '../shader-lib/wgsl/chunks/gsplat/frag/
2219
let id = 0;
2320
const tempMap = new Map();
2421

25-
/**
26-
* A helper class to cache quad renders for work buffer rendering.
27-
*
28-
* @ignore
29-
*/
30-
class WorkBufferRenderInfo {
31-
/** @type {ShaderMaterial} */
32-
material;
33-
34-
/** @type {QuadRender} */
35-
quadRender;
36-
37-
constructor(device, key, material) {
38-
this.device = device;
39-
this.material = material;
40-
41-
const clonedDefines = new Map(material.defines);
42-
const shader = ShaderUtils.createShader(this.device, {
43-
uniqueName: `SplatCopyToWorkBuffer:${key}`,
44-
attributes: { vertex_position: SEMANTIC_POSITION },
45-
vertexDefines: clonedDefines,
46-
fragmentDefines: clonedDefines,
47-
vertexChunk: 'fullscreenQuadVS',
48-
fragmentGLSL: glslGsplatCopyToWorkBufferPS,
49-
fragmentWGSL: wgslGsplatCopyToWorkBufferPS,
50-
fragmentOutputTypes: ['vec4', 'uvec4', 'uvec2']
51-
});
52-
53-
this.quadRender = new QuadRender(shader);
54-
}
55-
56-
destroy() {
57-
this.material?.destroy();
58-
this.quadRender?.destroy();
59-
}
60-
}
61-
6222
/**
6323
* Base class for a GSplat resource and defines common properties.
6424
*

0 commit comments

Comments
 (0)