diff --git a/examples/tests/text-vertical-center.ts b/examples/tests/text-vertical-center.ts index ff296ab..a10579c 100644 --- a/examples/tests/text-vertical-center.ts +++ b/examples/tests/text-vertical-center.ts @@ -101,13 +101,18 @@ export default async function test({ renderer, testRoot }: ExampleSettings) { clipping: true, }); - // Geometric center guide. + // Geometric center guide. Height is 1.35, not 1, to avoid sub-pixel + // rasterization gaps: at the default examples config (resolution=720, + // appHeight=1080) the logical→physical scale is 0.667, so a 1-logical-px + // line at certain Y positions covers no pixel center and disappears + // (e.g. the fontSize 60 row at y=430). A 2-logical-px line is always + // ≥ 1 physical pixel and guaranteed to rasterize. renderer.createNode({ parent: box, x: 0, y: Math.round(BOX_H / 2), w: BOX_W, - h: 1, + h: 1.35, color: 0xff0000ff, }); diff --git a/src/core/renderers/webgl/WebGlRenderer.ts b/src/core/renderers/webgl/WebGlRenderer.ts index 3e8d325..1fc7928 100644 --- a/src/core/renderers/webgl/WebGlRenderer.ts +++ b/src/core/renderers/webgl/WebGlRenderer.ts @@ -530,20 +530,12 @@ export class WebGlRenderer extends CoreRenderer { return false; } - const shader = node.props.shader as WebGlShaderNode; - const curShader = curRenderOp.shader as WebGlShaderNode; - - if (curShader.shaderKey === 'default' && shader.shaderKey === 'default') { - return true; - } - - // Check if the shader is the same - if (curShader !== shader) { - return false; - } + // Correctness checks first — these MUST pass regardless of shader. + // RTT mismatch and clipping rect differences can't be batched: the + // draw call applies one framebuffer / one scissor to every quad in + // the op. // Force new render operation if rendering to texture is different - // This is the cheap check, so do it first if ( USE_RTT && (curRenderOp.parentHasRenderTexture !== node.parentHasRenderTexture || @@ -553,11 +545,22 @@ export class WebGlRenderer extends CoreRenderer { } // Switching clipping rect will require a new render operation - // This involves object accessing so do it after integer/boolean checks if (compareRect(curRenderOp.clippingRect, node.clippingRect) === false) { return false; } + const shader = node.props.shader as WebGlShaderNode; + const curShader = curRenderOp.shader as WebGlShaderNode; + + if (curShader.shaderKey === 'default' && shader.shaderKey === 'default') { + return true; + } + + // Check if the shader is the same + if (curShader !== shader) { + return false; + } + if ( USE_RTT && node.parentHasRenderTexture === true && diff --git a/visual-regression/certified-snapshots/chromium-ci/clipping-2.png b/visual-regression/certified-snapshots/chromium-ci/clipping-2.png index b0f0eb3..2955c73 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/clipping-2.png and b/visual-regression/certified-snapshots/chromium-ci/clipping-2.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/text-alpha-2.png b/visual-regression/certified-snapshots/chromium-ci/text-alpha-2.png index 3a63f17..b87d63e 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/text-alpha-2.png and b/visual-regression/certified-snapshots/chromium-ci/text-alpha-2.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-1.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-1.png index e539119..17a52a9 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-1.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-1.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-10.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-10.png index f703d98..241e76a 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-10.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-10.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-14.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-14.png index 21f3129..17c00fa 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-14.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-14.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-16.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-16.png index f703d98..241e76a 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-16.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-16.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-17.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-17.png index f08f622..bedcc63 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-17.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-17.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-18.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-18.png index 0058eb3..ab2e5a5 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-18.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-18.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-2.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-2.png index 8674371..fedcb34 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-2.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-2.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-3.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-3.png index ecb1299..824ad46 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-3.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-3.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-4.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-4.png index 499b0a5..c38ca9d 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-4.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-4.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-5.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-5.png index 940afa5..9a81864 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-5.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-5.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-6.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-6.png index 62177b1..541ac24 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-6.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-6.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-7.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-7.png index 4a4bec9..cbf7f9c 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-7.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-7.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-8.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-8.png index e945f84..a4ca254 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-8.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-8.png differ diff --git a/visual-regression/certified-snapshots/chromium-ci/viewport-events-9.png b/visual-regression/certified-snapshots/chromium-ci/viewport-events-9.png index 21f3129..17c00fa 100644 Binary files a/visual-regression/certified-snapshots/chromium-ci/viewport-events-9.png and b/visual-regression/certified-snapshots/chromium-ci/viewport-events-9.png differ