From 380b235f508d0059f33bf10e7b1fe2d07a1ddd83 Mon Sep 17 00:00:00 2001 From: Ayyoub Aharchi <262629724+AyyoubAha@users.noreply.github.com> Date: Sun, 13 Sep 2026 13:35:53 +0200 Subject: [PATCH] Round interpolated texture IDs before shader lookup --- src/renderer/webgl/shaders/GetTexRes-glsl.js | 4 +- src/renderer/webgl/shaders/GetTexture-glsl.js | 5 +- src/renderer/webgl/shaders/src/GetTexRes.glsl | 3 +- .../webgl/shaders/src/GetTexture.glsl | 8 +- .../renderer/webgl/texture-id-regression.html | 199 ++++++++++++++++++ 5 files changed, 211 insertions(+), 8 deletions(-) create mode 100644 tests/renderer/webgl/texture-id-regression.html diff --git a/src/renderer/webgl/shaders/GetTexRes-glsl.js b/src/renderer/webgl/shaders/GetTexRes-glsl.js index a129bbb113..41ac2fd245 100644 --- a/src/renderer/webgl/shaders/GetTexRes-glsl.js +++ b/src/renderer/webgl/shaders/GetTexRes-glsl.js @@ -5,7 +5,7 @@ module.exports = [ ' #if TEXTURE_COUNT == 1', ' float texId = 0.0;', ' #else', - ' float texId = outTexDatum;', + ' float texId = floor(outTexDatum + 0.5);', ' #endif', ' #pragma phaserTemplate(texIdProcess)', ' vec2 texRes = vec2(0.0);', @@ -18,5 +18,5 @@ module.exports = [ ' }', ' }', ' return texRes;', - '}', + '}' ].join('\n'); diff --git a/src/renderer/webgl/shaders/GetTexture-glsl.js b/src/renderer/webgl/shaders/GetTexture-glsl.js index 76a70ef2c0..1e3b81ebfe 100644 --- a/src/renderer/webgl/shaders/GetTexture-glsl.js +++ b/src/renderer/webgl/shaders/GetTexture-glsl.js @@ -5,8 +5,9 @@ module.exports = [ ' #if TEXTURE_COUNT == 1', ' return texture2D(uMainSampler[0], texCoord);', ' #else', - ' if (outTexDatum == 0.0) return texture2D(uMainSampler[0], texCoord);', - ' #define ELSE_TEX_CASE(INDEX) else if (outTexDatum == float(INDEX)) return texture2D(uMainSampler[INDEX], texCoord);', + ' float texId = floor(outTexDatum + 0.5);', + ' if (texId == 0.0) return texture2D(uMainSampler[0], texCoord);', + ' #define ELSE_TEX_CASE(INDEX) else if (texId == float(INDEX)) return texture2D(uMainSampler[INDEX], texCoord);', ' #pragma phaserTemplate(texIdProcess)', ' else return vec4(0.0, 0.0, 0.0, 0.0);', ' #endif', diff --git a/src/renderer/webgl/shaders/src/GetTexRes.glsl b/src/renderer/webgl/shaders/src/GetTexRes.glsl index 582b07f02e..eca2dc2105 100644 --- a/src/renderer/webgl/shaders/src/GetTexRes.glsl +++ b/src/renderer/webgl/shaders/src/GetTexRes.glsl @@ -5,7 +5,8 @@ vec2 getTexRes () #if TEXTURE_COUNT == 1 float texId = 0.0; #else - float texId = outTexDatum; + // Use the same rounded ID as getTexture. + float texId = floor(outTexDatum + 0.5); #endif #pragma phaserTemplate(texIdProcess) diff --git a/src/renderer/webgl/shaders/src/GetTexture.glsl b/src/renderer/webgl/shaders/src/GetTexture.glsl index 2fc75cb06a..cf530b0031 100644 --- a/src/renderer/webgl/shaders/src/GetTexture.glsl +++ b/src/renderer/webgl/shaders/src/GetTexture.glsl @@ -5,9 +5,11 @@ vec4 getTexture (vec2 texCoord) #if TEXTURE_COUNT == 1 return texture2D(uMainSampler[0], texCoord); #else - if (outTexDatum == 0.0) return texture2D(uMainSampler[0], texCoord); - #define ELSE_TEX_CASE(INDEX) else if (outTexDatum == float(INDEX)) return texture2D(uMainSampler[INDEX], texCoord); + // Interpolation can introduce small errors even when all vertices use the same ID. + float texId = floor(outTexDatum + 0.5); + if (texId == 0.0) return texture2D(uMainSampler[0], texCoord); + #define ELSE_TEX_CASE(INDEX) else if (texId == float(INDEX)) return texture2D(uMainSampler[INDEX], texCoord); #pragma phaserTemplate(texIdProcess) else return vec4(0.0, 0.0, 0.0, 0.0); #endif -} \ No newline at end of file +} diff --git a/tests/renderer/webgl/texture-id-regression.html b/tests/renderer/webgl/texture-id-regression.html new file mode 100644 index 0000000000..1c87c052c7 --- /dev/null +++ b/tests/renderer/webgl/texture-id-regression.html @@ -0,0 +1,199 @@ + + +Texture ID shader regression + +

Texture ID shader regression

+

Serve the repository root over HTTP and open this file in a WebGL 1 browser.

+

This test deliberately supplies slightly non-integer texture IDs to the real GLSL helpers. +It checks their tolerance of interpolation error; it does not reproduce the rasterizer-specific +rotation bug in #7372.

+ +
Ready.
+ + + + + +