I got the visualizer code running on my iPod Touch 4th generation. I was able to get it to run at 60fps with the full resolution of the retina screen. The process was to render to a texture, switching between three shaders. One for spitting out a texture across the whole screen. Another for drawing point sprites for solid dots, gradient dots, gradient square, a gradient doughnut (had an extra channel) and of course the default solid square. For some odd reason, probably because of using my own shaders, having a solid dot on the iPhone using OpenGL is not as easy as it sounds (draw dot at this position with this color). And of course the filter. The original code uses the standard 3X3 filter, with 9 texture reads. I changed it to only use the corners. A nice blur effect can still be made using the corners and the center. Might attempt to use the full 3X3. A big part of this for speed was to reduce the dependent texture reads. The offsets into the screen texture to apply the filter have to be a varying vector. Instead of subtracting an offset, I got a huge gain from putting them into a varying vector. It looks like the openGL ES 2.0 specifications say that up to 8 varying vectors can be specified. I was getting about 40fps, until I got rid of the dependent texture reads. Now it runs fast and smooth.