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

  1. Set reverseCulling = true on the geometry renderer block feeding geomBackDepth
  2. Connect geomBackDepth to a dedicated back-face geometry renderer with reverse culling
  3. 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

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


AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30). Data as JSON: /api/errors/03a969fedf26ed7a. Report an issue: GitHub.