From f75f227f5a99e0d066325d99b8ed5fce9d534a8b Mon Sep 17 00:00:00 2001 From: BHARATH0153 Date: Tue, 2 Jun 2026 21:49:43 +0530 Subject: [PATCH 1/4] fix uSampler override: simplify with user-shader check Apply review feedback: instead of tracking _userSetUniforms with _isInternalSetUniform flag, only override uSampler when shader is built-in or texture is active. Removes _userSetUniforms Set, _isInternalSetUniform flag, and per-frame clearing in _update(). --- src/core/p5.Renderer3D.js | 7 ++++- test/unit/visual/cases/webgl.js | 24 ++++++++++++++++++ .../000.png | Bin 0 -> 235 bytes .../metadata.json | 3 +++ test/unit/webgl/p5.RendererGL.js | 23 +++++++++++++++++ 5 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/000.png create mode 100644 test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/metadata.json diff --git a/src/core/p5.Renderer3D.js b/src/core/p5.Renderer3D.js index d83df0170d..47a65d2a7c 100644 --- a/src/core/p5.Renderer3D.js +++ b/src/core/p5.Renderer3D.js @@ -1501,7 +1501,12 @@ export class Renderer3D extends Renderer { // the next time a shader is used. However, the texture() function // works differently and is global p5 state. If the p5 state has // been cleared, we also need to clear the value in uSampler to match. - fillShader.setUniform("uSampler", this.states._tex || empty); + const isUserFillShader = + fillShader === this.states.userFillShader || + fillShader === this.states.userImageShader; + if (this.states._tex || !isUserFillShader) { + fillShader.setUniform("uSampler", this.states._tex || empty); + } fillShader.setUniform( "uTint", this.states.tint?._getRGBA([255, 255, 255, 255]) ?? [255, 255, 255, 255] diff --git a/test/unit/visual/cases/webgl.js b/test/unit/visual/cases/webgl.js index abc661e2cd..850b0b4a97 100644 --- a/test/unit/visual/cases/webgl.js +++ b/test/unit/visual/cases/webgl.js @@ -1754,4 +1754,28 @@ visualTest('randomGaussian() in a fragment loop averages to the mean', (p5, scre screenshot(); }); }); + + visualTest( + 'user-set uSampler on custom shader is not overridden', + function(p5, screenshot) { + p5.createCanvas(50, 50, p5.WEBGL); + + const myShader = p5.createFilterShader(`precision highp float; +uniform sampler2D uSampler; +varying vec2 vTexCoord; +void main() { + gl_FragColor = texture2D(uSampler, vTexCoord); +}`); + + const fbo = p5.createFramebuffer(); + fbo.draw(() => p5.background(255, 0, 0)); + + p5.shader(myShader); + p5.noStroke(); + myShader.setUniform('uSampler', fbo); + p5.plane(p5.width, p5.height); + + screenshot(); + } + ); }); diff --git a/test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/000.png b/test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/000.png new file mode 100644 index 0000000000000000000000000000000000000000..00d35a20a9ec947f7a9bbfb392ef52f3c8595bcb GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET1)eUBAr*{oCLQEFV8Fxd`|ZAE ztb_b)F4p4KI+kfKV$ZMLC4Dd0Th8u@=|qWx9i0sOr*Xd7A*P&Mvdp<>#(}X z+|8|=oAQjgX9nZ;*M^te((Dd&NEYm_>z&BY!0`XSx4Y9`pj+8MZe?aLu}Wc_=J@M1 PP=vwL)z4*}Q$iB}_H myp5.background('red')); + + myp5.shader(myShader); + myp5.noStroke(); + myShader.setUniform('uSampler', fbo); + + myp5.plane(myp5.width, myp5.height); + + const pixel = myp5.get(5, 5); + assert.deepEqual(pixel, [255, 0, 0, 255]); + }); }); suite('default stroke shader', function() { From 355a04b4138b5acdba08e5ea37ddd112d3457cb2 Mon Sep 17 00:00:00 2001 From: BHARATH0153 Date: Wed, 3 Jun 2026 20:15:20 +0530 Subject: [PATCH 2/4] fix: only skip uSampler override when user explicitly set it --- src/core/p5.Renderer3D.js | 7 +++---- src/webgl/p5.Shader.js | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/core/p5.Renderer3D.js b/src/core/p5.Renderer3D.js index 47a65d2a7c..363773befc 100644 --- a/src/core/p5.Renderer3D.js +++ b/src/core/p5.Renderer3D.js @@ -1501,12 +1501,11 @@ export class Renderer3D extends Renderer { // the next time a shader is used. However, the texture() function // works differently and is global p5 state. If the p5 state has // been cleared, we also need to clear the value in uSampler to match. - const isUserFillShader = - fillShader === this.states.userFillShader || - fillShader === this.states.userImageShader; - if (this.states._tex || !isUserFillShader) { + this._settingFillUniforms = true; + if (this.states._tex || !fillShader._userSetSampler) { fillShader.setUniform("uSampler", this.states._tex || empty); } + this._settingFillUniforms = false; fillShader.setUniform( "uTint", this.states.tint?._getRGBA([255, 255, 255, 255]) ?? [255, 255, 255, 255] diff --git a/src/webgl/p5.Shader.js b/src/webgl/p5.Shader.js index b12d9853cf..c39de0bd71 100644 --- a/src/webgl/p5.Shader.js +++ b/src/webgl/p5.Shader.js @@ -1103,6 +1103,10 @@ class Shader { return; } + if (uniformName === 'uSampler' && !this._renderer._settingFillUniforms) { + this._userSetSampler = true; + } + // In p5.strands-related code, where some of the code may be in // p5.webgpu.js instead of the main p5.js build, we generally use // duck typing instead of instanceof to avoid accidentally importing From d444280608adc27c08ff4fefcd538c70e0f78414 Mon Sep 17 00:00:00 2001 From: BHARATH0153 Date: Wed, 3 Jun 2026 20:21:11 +0530 Subject: [PATCH 3/4] remove screenshot baseline files for user-set uSampler visual test --- .../000.png | Bin 235 -> 0 bytes .../metadata.json | 3 --- 2 files changed, 3 deletions(-) delete mode 100644 test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/000.png delete mode 100644 test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/metadata.json diff --git a/test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/000.png b/test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/000.png deleted file mode 100644 index 00d35a20a9ec947f7a9bbfb392ef52f3c8595bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET1)eUBAr*{oCLQEFV8Fxd`|ZAE ztb_b)F4p4KI+kfKV$ZMLC4Dd0Th8u@=|qWx9i0sOr*Xd7A*P&Mvdp<>#(}X z+|8|=oAQjgX9nZ;*M^te((Dd&NEYm_>z&BY!0`XSx4Y9`pj+8MZe?aLu}Wc_=J@M1 PP=vwL)z4*}Q$iB}_H Date: Thu, 4 Jun 2026 06:11:51 +0530 Subject: [PATCH 4/4] add screenshot baseline for user-set uSampler visual test --- .../000.png | Bin 0 -> 235 bytes .../metadata.json | 3 +++ 2 files changed, 3 insertions(+) create mode 100644 test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/000.png create mode 100644 test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/metadata.json diff --git a/test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/000.png b/test/unit/visual/screenshots/WebGL/user-set uSampler on custom shader is not overridden/000.png new file mode 100644 index 0000000000000000000000000000000000000000..00d35a20a9ec947f7a9bbfb392ef52f3c8595bcb GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET1)eUBAr*{oCLQEFV8Fxd`|ZAE ztb_b)F4p4KI+kfKV$ZMLC4Dd0Th8u@=|qWx9i0sOr*Xd7A*P&Mvdp<>#(}X z+|8|=oAQjgX9nZ;*M^te((Dd&NEYm_>z&BY!0`XSx4Y9`pj+8MZe?aLu}Wc_=J@M1 PP=vwL)z4*}Q$iB}_H