I'm loving the friendliness of the OpenGLGraphicsContextCustomShader class, but I ran into two issues, both related to the pixelPos shader variable. (This is on Mac, not sure about Windows.)
1. This class automatically creates a varying vec2 called "pixelPos" that is available to your shader. But the x and y values of pixelPos seem to be relative to the window, not the component being drawn in. Is this expected, or a bug? When you call OpenGLGraphicsContextCustomShader::fillRect, it takes a rect in the component's local coordinates, but the shader's pixelPos is in window coordinates.
You can see this in the JUCE demo app. Go to the OpenGL 2D demo, select the Circle shader. If you edit the shader and try to set the center at 0, 0, you'll see the circle goes behind the demo list on the left side of the window.
2. Also related to the pixelPos variable. I don't think this variable is handling Retina displays correctly. JUCE does the right thing by abstracting away Retina pixel coordinates. But if you have a Retina Mac, again go to the OpenGL 2D demo, and you'll see that the circle is positioned differently, and with a different radius than than if you run it in non-Retina mode.
OpenGLGraphicsContextCustomShader abstracts away the Retina situation. You call its fillRect member function the same way whether you're on a Retina screen or not, but the shader gets pixel coordinates that don't match up with the rectangle passed to fillRect. I know OpenGL is not naturally Retina-savvy, but maybe the right thing to do is for JUCE to compensate for Retina when setting up the pixelPos variable?