is there a better solution to create a sketch using multiple shaders?
PShader myShader, pixelate;
PImage img;
PGraphics pg, buf;
void settings() {
  size(1000, 1000, P3D);
}
void setup() {
  myShader = loadShader("glitch.glsl");
  pixelate = loadShader("pixelate.glsl");
  myShader.set("iResolution", float(width), float(height));
  pixelate.set("pixels", 200., 200.);
  pg = createGraphics(width, height, P3D);
  buf = createGraphics(width, height, P3D);
}
void draw() {
  pg.beginDraw();
  pg.translate(width/2, height/2);
  pg.background(0);
  pg.fill(255);
  pg.stroke(0);
  pg.rotateY(frameCount*0.02);
  pg.sphere(400);
  pg.endDraw();
  pg.filter(pixelate);
  myShader.set("iTime", millis()/1.);
  //buf.beginDraw();
  buf=pg;
  //buf.endDraw();
  buf.filter(myShader);
  image(buf, 0, 0, width, height);
}
thank you!!
             
            
              
              
              2 Likes
            
            
           
          
            
            
              What do you mean by “is there a better solution” exactly?
Some comments -
What is buf for?  You seem to immediately set buf=pg.
Do you need to use filter with myShader?  Could you use this instead?
shader(myShader);
image(buf, 0, 0, width, height);
Given that you don’t do anything with the output of the first shader before drawing through the second shader, could you merge the two shaders into a single shader?
It all depends on what the shaders are doing really!
             
            
              
              
              1 Like
            
            
           
          
            
            
              nope…i can’t use one shader, they are really different.
but i’ve just see that it works fine also like this:
void draw() {
  println(frameRate);
  pg.beginDraw();
  pg.translate(width/2, height/2);
  pg.background(0);
  pg.noFill();
  pg.stroke(255);
  pg.rotateY(frameCount*0.02);
  pg.sphere(400);
  pg.endDraw();
  pg.filter(pixelate);
  pg.filter(myShader);
  myShader.set("iTime", millis()/1.);
  image(pg, 0, 0, width, height);
}
i never use filter before, but it looks work fine!!
btw thank you for the answer @neilcsmith !!
             
            
              
              
              1 Like
            
            
           
          
            
            
              Yes, it was a long shot on the single shader! 
You should be able to do …
pg.filter(pixelate);
myShader.set("iTime", millis()/1.);
shader(myShader);
image(pg, 0, 0, width, height);
… though, which will use the second shader in the draw to the screen, which will cut down the workload a bit.
Surely you want to set iTime before you use the shader either way?!
             
            
              
              
              1 Like
            
            
           
          
            
            
              oh…in some example i saw i ever see set after shader declaretion!!
it’s uncorrect?
             
            
              
              
              
            
            
           
          
            
            
              Yes!  You’re currently setting the value for the next time though draw().