@@ -14,7 +14,7 @@ const createFragmentShader = (options) => {
1414 const uniforms = { } ;
1515
1616 const shader = /* glsl */ `#version 300 es
17- precision mediump float;
17+ precision lowp float;
1818
1919 uniform float u_time; // Time in seconds
2020 uniform float u_h;
@@ -189,7 +189,6 @@ function createGradientTexture(p, colors) {
189189export let WavyScene = gradientColors => p => {
190190 let width ;
191191 let height ;
192- let outBuffer ;
193192 let waveShader ;
194193 let canvas ;
195194 let gradientTexture ;
@@ -202,30 +201,19 @@ export let WavyScene = gradientColors => p => {
202201 height = p . _userNode . offsetHeight ;
203202 canvas = p . createCanvas ( width , height , p . WEBGL ) ;
204203
205- // Check available webgl features if something isn't working
206- // const ctx = canvas.elt.getContext("webgl2")
207- // console.log(ctx.getSupportedExtensions())
208-
209- // Table of supported texture types: https://webgl2fundamentals.org/webgl/lessons/webgl-data-textures.html
210- // Mobile targets usually can't render float textures. This buffer's shader needs to process to RGBA
211- outBuffer = p . createFramebuffer ( {
212- format : p . UNSIGNED_BYTE ,
213- width : width ,
214- height : height ,
215- density : 1 ,
216- depth : false
217- } ) ;
218-
219204 p . imageMode ( p . CENTER ) ;
220205 p . noStroke ( ) ;
221206
222-
223207 gradientTexture = createGradientTexture ( p , gradientColors ) ;
224208 const shader = createFragmentShader ( { } ) ;
225209 waveShader = p . createShader ( DEFAULT_VERTEX_SHADER , shader [ 'shader' ] ) ;
226- // First call builds the shader program
227210 p . shader ( waveShader ) ;
228211
212+ // Set constant uniforms once
213+ waveShader . setUniform ( 'u_h' , height ) ;
214+ waveShader . setUniform ( 'u_w' , width ) ;
215+ waveShader . setUniform ( 'u_gradient' , gradientTexture ) ;
216+
229217 // Start with canvas invisible for fade-in effect
230218 canvas . elt . style . opacity = '0' ;
231219 canvas . elt . style . transition = 'opacity 0.8s ease-in-out' ;
@@ -254,21 +242,12 @@ export let WavyScene = gradientColors => p => {
254242 }
255243
256244 p . draw = ( ) => {
257- outBuffer . begin ( ) ;
258245 p . clear ( ) ;
259- p . shader ( waveShader ) ;
260246
261- // Set uniforms
247+ // Only update time uniform (others are set once in setup)
262248 waveShader . setUniform ( 'u_time' , p . millis ( ) / 1000.0 ) ;
263- waveShader . setUniform ( 'u_h' , height ) ;
264- waveShader . setUniform ( 'u_w' , width ) ;
265- waveShader . setUniform ( 'u_gradient' , gradientTexture ) ;
266249
267250 p . rect ( 0 , 0 , width , - height ) ;
268- outBuffer . end ( ) ;
269-
270- p . clear ( ) ;
271- p . image ( outBuffer , 0 , 0 , p . _userNode . offsetWidth , - p . _userNode . offsetHeight ) ;
272251
273252 // Fade in after first successful render
274253 if ( ! hasRenderedFirstFrame ) {
@@ -281,7 +260,10 @@ export let WavyScene = gradientColors => p => {
281260 width = p . _userNode . offsetWidth ;
282261 height = p . _userNode . offsetHeight ;
283262 p . resizeCanvas ( width , height , true ) ;
284- outBuffer . resize ( width , height ) ;
263+
264+ // Update size-dependent uniforms
265+ waveShader . setUniform ( 'u_h' , height ) ;
266+ waveShader . setUniform ( 'u_w' , width ) ;
285267 }
286268
287269 // Cleanup when p5 instance is removed
0 commit comments