Skip to content

Commit 3360fdf

Browse files
dakerfinetjul
authored andcommitted
feat(WebGPU): Depth only / zbuffer pass support in CellArrayMapper
1 parent a200ea2 commit 3360fdf

4 files changed

Lines changed: 55 additions & 9 deletions

File tree

Sources/Rendering/WebGPU/CellArrayMapper/index.js

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -426,20 +426,33 @@ function vtkWebGPUCellArrayMapper(publicAPI, model) {
426426
};
427427

428428
// Renders myself
429+
publicAPI.renderForPass = (renderEncoder, depthOnly = false) => {
430+
model.depthOnlyPass = depthOnly;
431+
publicAPI.prepareToDraw(renderEncoder);
432+
model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);
433+
model.depthOnlyPass = false;
434+
};
435+
429436
publicAPI.translucentPass = (prepass) => {
430437
if (prepass) {
431-
publicAPI.prepareToDraw(model.WebGPURenderer.getRenderEncoder());
432-
model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);
438+
publicAPI.renderForPass(model.WebGPURenderer.getRenderEncoder());
433439
}
434440
};
435441

436442
publicAPI.opaquePass = (prepass) => {
437443
if (prepass) {
438-
publicAPI.prepareToDraw(model.WebGPURenderer.getRenderEncoder());
439-
model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);
444+
publicAPI.renderForPass(model.WebGPURenderer.getRenderEncoder());
440445
}
441446
};
442447

448+
publicAPI.zBufferPass = (prepass) => {
449+
if (prepass) {
450+
publicAPI.renderForPass(model.WebGPURenderer.getRenderEncoder(), true);
451+
}
452+
};
453+
454+
publicAPI.opaqueZBufferPass = (prepass) => publicAPI.zBufferPass(prepass);
455+
443456
publicAPI.updateUBO = () => {
444457
const actor = model.WebGPUActor.getRenderable();
445458
const ppty = actor.getProperty();
@@ -621,6 +634,18 @@ function vtkWebGPUCellArrayMapper(publicAPI, model) {
621634
primitive: {
622635
cullMode: publicAPI.getCullMode(),
623636
},
637+
...(model.depthOnlyPass
638+
? {
639+
fragment: {
640+
targets: [
641+
{
642+
format: 'rgba16float',
643+
writeMask: 0,
644+
},
645+
],
646+
},
647+
}
648+
: {}),
624649
});
625650

626651
publicAPI.getCoincidentParameters = () => {
@@ -1545,6 +1570,9 @@ function vtkWebGPUCellArrayMapper(publicAPI, model) {
15451570
let pipelineHash = `pd${model.useRendererMatrix ? 'r' : ''}${
15461571
model.forceZValue ? 'z' : ''
15471572
}`;
1573+
if (model.depthOnlyPass) {
1574+
pipelineHash += 'd';
1575+
}
15481576

15491577
if (
15501578
model.primitiveType === PrimitiveTypes.TriangleEdges ||
@@ -1622,6 +1650,7 @@ function vtkWebGPUCellArrayMapper(publicAPI, model) {
16221650
// ----------------------------------------------------------------------------
16231651

16241652
const DEFAULT_VALUES = {
1653+
depthOnlyPass: false,
16251654
is2D: false,
16261655
cellArray: null,
16271656
currentInput: null,

Sources/Rendering/WebGPU/RenderEncoder/index.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,20 @@ function vtkWebGPURenderEncoder(publicAPI, model) {
5252
}
5353
model.handle.setPipeline(pl.getHandle());
5454
const pd = pl.getPipelineDescription();
55+
const fragmentTargets = pd.fragment?.targets;
5556

5657
// check attachment state
57-
if (model.colorTextureViews.length !== pd.fragment.targets.length) {
58+
if (model.colorTextureViews.length !== fragmentTargets.length) {
5859
console.log(
59-
`mismatched attachment counts on pipeline ${pd.fragment.targets.length} while encoder has ${model.colorTextureViews.length}`
60+
`mismatched attachment counts on pipeline ${fragmentTargets.length} while encoder has ${model.colorTextureViews.length}`
6061
);
6162
console.trace();
6263
} else {
6364
for (let i = 0; i < model.colorTextureViews.length; i++) {
6465
const fmt = model.colorTextureViews[i].getTexture()?.getFormat();
65-
if (fmt && fmt !== pd.fragment.targets[i].format) {
66+
if (fmt && fmt !== fragmentTargets[i].format) {
6667
console.log(
67-
`mismatched attachments for attachment ${i} on pipeline ${pd.fragment.targets[i].format} while encoder has ${fmt}`
68+
`mismatched attachments for attachment ${i} on pipeline ${fragmentTargets[i].format} while encoder has ${fmt}`
6869
);
6970
console.trace();
7071
}

Sources/Rendering/WebGPU/Renderer/index.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,19 @@ function vtkWebGPURenderer(publicAPI, model) {
283283
}
284284
};
285285

286+
publicAPI.zBufferPass = (prepass) => {
287+
if (prepass) {
288+
model.renderEncoder.begin(model._parent.getCommandEncoder());
289+
publicAPI.updateUBO();
290+
publicAPI.updateSSBO();
291+
} else {
292+
publicAPI.scissorAndViewport(model.renderEncoder);
293+
model.renderEncoder.end();
294+
}
295+
};
296+
297+
publicAPI.opaqueZBufferPass = (prepass) => publicAPI.zBufferPass(prepass);
298+
286299
publicAPI.clear = () => {
287300
if (model.renderable.getTransparent() || model.suppressClear) {
288301
return;

Sources/Rendering/WebGPU/ShaderDescription/index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ function vtkWebGPUShaderDescription(publicAPI, model) {
7777
).result;
7878
}
7979

80-
if (model.outputNames.length + model.builtinOutputNames.length) {
80+
if (
81+
model.outputNames.length + model.builtinOutputNames.length ||
82+
model.code.includes('//VTK::IOStructs::Output')
83+
) {
8184
const outputStruct = [`struct ${model.type}Output\n{`];
8285
for (let i = 0; i < model.outputNames.length; i++) {
8386
if (model.outputInterpolations[i] !== undefined) {

0 commit comments

Comments
 (0)