BabylonJS/Babylon.js · error · Error
SSR post process "${this.name}": Automatic thickness computa
Error message
SSR post process "${this.name}": Automatic thickness computation requires the geometry renderer block for the back depth texture to have reverse culling enabled! What it means
For automatic SSR thickness computation, the block providing the back depth texture must render back faces with reverse culling so depth represents the far side of geometry. If the back depth comes from a NodeRenderGraphGeometryRendererBlock whose reverseCulling is false, _buildBlock throws.
Source
Thrown at packages/dev/core/src/FrameGraph/Node/Blocks/PostProcesses/ssrPostProcessBlock.pure.ts:437
protected override _buildBlock(state: NodeRenderGraphBuildState) {
super._buildBlock(state);
this._frameGraphTask.normalTexture = this.geomNormal.connectedPoint?.value as FrameGraphTextureHandle;
this._frameGraphTask.depthTexture = this.geomDepth.connectedPoint?.value as FrameGraphTextureHandle;
this._frameGraphTask.reflectivityTexture = this.geomReflectivity.connectedPoint?.value as FrameGraphTextureHandle;
this._frameGraphTask.backDepthTexture = this.geomBackDepth.connectedPoint?.value as FrameGraphTextureHandle;
this._frameGraphTask.camera = this.camera.connectedPoint?.value as Camera;
if (this.enableAutomaticThicknessComputation) {
if (!this._frameGraphTask.backDepthTexture) {
throw new Error(`SSR post process "${this.name}": Automatic thickness computation requires a back depth texture to be connected!`);
}
const geomBackDepthOwnerBlock = this.geomBackDepth.connectedPoint!.ownerBlock;
if (geomBackDepthOwnerBlock.getClassName() === "NodeRenderGraphGeometryRendererBlock") {
const geometryBackFaceRendererBlock = geomBackDepthOwnerBlock as NodeRenderGraphGeometryRendererBlock;
if (!geometryBackFaceRendererBlock.reverseCulling) {
throw new Error(
`SSR post process "${this.name}": Automatic thickness computation requires the geometry renderer block for the back depth texture to have reverse culling enabled!`
);
}
if (this._frameGraphTask.depthTexture) {
const geomDepthOwnerBlock = this.geomDepth.connectedPoint!.ownerBlock;
if (geomDepthOwnerBlock.getClassName() === "NodeRenderGraphGeometryRendererBlock") {
const geomDepthConnectionPointType = this.geomDepth.connectedPoint!.type;
const geomBackDepthConnectionPointType = this.geomBackDepth.connectedPoint!.type;
if (geomDepthConnectionPointType !== geomBackDepthConnectionPointType) {
throw new Error(
`SSR post process "${this.name}": Automatic thickness computation requires that geomDepth and geomBackDepth have the same type (view or screen space depth)!`
);
}
}
}
}
View on GitHub (pinned to 0592b347b8)
Solutions
- Set reverseCulling = true on the geometry renderer block feeding geomBackDepth
- Connect geomBackDepth to a dedicated back-face geometry renderer with reverse culling
- Disable automatic thickness computation if back-face depth is not available
Example fix
// before geomRenderer.connect(ssrBlock.geomBackDepth); // after geomRenderer.reverseCulling = true; geomRenderer.connect(ssrBlock.geomBackDepth);
Defensive patterns
Strategy: validation
Validate before calling
const owner = ssrBlock.geomBackDepth.connectedPoint?.ownerBlock;
if (owner?.getClassName() === 'NodeRenderGraphGeometryRendererBlock' && ssrBlock.enableAutomaticThicknessComputation && !owner.reverseCulling) {
owner.reverseCulling = true;
} Type guard
function isGeomRenderer(b) { return b?.getClassName?.() === 'NodeRenderGraphGeometryRendererBlock'; } Try / catch
try { graph.build(); } catch (e) { if (e.message.includes('reverse culling')) { const owner = ssrBlock.geomBackDepth.connectedPoint.ownerBlock; owner.reverseCulling = true; graph.build(); } else { throw e; } } Prevention
- Whenever feeding geomBackDepth from a geometry renderer, set reverseCulling = true as a pair
- Add a checklist item for SSR setup: back depth + reverse culling + matching depth types
- Prefer SSR setup helpers/presets over manual wiring
When it happens
Trigger: Building a graph where geomBackDepth is connected to a NodeRenderGraphGeometryRendererBlock with reverseCulling left at its default (false) while enableAutomaticThicknessComputation is enabled.
Common situations: Wiring the geometry renderer's regular depth output instead of configuring it for back-face depth; forgetting the reverseCulling flag when setting up SSR by hand.
Related errors
- SSR post process "${this.name}": Automatic thickness computa
- SSR post process "${this.name}": Automatic thickness computa
- Unable to generateSoloNavMesh: ${result.error}
- FlowGraphSetVariableBlock: variable and variables are both d
- NodeRenderGraphInputBlock: External input "${this.name}" is
AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30).
Data as JSON: /api/errors/03a969fedf26ed7a.
Report an issue: GitHub.