Skip to content

Commit c192f04

Browse files
committed
feat(WebGPU): Depth only / zbuffer pass support in CellArrayMapper
1 parent 07198a2 commit c192f04

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
@@ -50,19 +50,20 @@ function vtkWebGPURenderEncoder(publicAPI, model) {
5050
}
5151
model.handle.setPipeline(pl.getHandle());
5252
const pd = pl.getPipelineDescription();
53+
const fragmentTargets = pd.fragment?.targets;
5354

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

Sources/Rendering/WebGPU/Renderer/index.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,19 @@ function vtkWebGPURenderer(publicAPI, model) {
356356
}
357357
};
358358

359+
publicAPI.zBufferPass = (prepass) => {
360+
if (prepass) {
361+
model.renderEncoder.begin(model._parent.getCommandEncoder());
362+
publicAPI.updateUBO();
363+
publicAPI.updateSSBO();
364+
} else {
365+
publicAPI.scissorAndViewport(model.renderEncoder);
366+
model.renderEncoder.end();
367+
}
368+
};
369+
370+
publicAPI.opaqueZBufferPass = (prepass) => publicAPI.zBufferPass(prepass);
371+
359372
publicAPI.clear = () => {
360373
if (model.renderable.getTransparent() || model.suppressClear) {
361374
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)