pour une interface de ce type :
j'utilise comme shader :
const std::string black_shader ="#version 150\n"
"void main() {\n"
" gl_FragColor = vec4(0.0,0.0,0.0,1.0);\n"
"}";
const std::string blur_shader = "uniform sampler2D texture;\n"
"uniform float blur_radius;\n"
"\n"
"void main()\n"
"{\n"
" vec2 offx = vec2(blur_radius, 0.0);\n"
" vec2 offy = vec2(0.0, blur_radius);\n"
"\n"
" vec4 pixel = texture2D(texture, gl_TexCoord[0].xy) * 4.0 +\n"
" texture2D(texture, gl_TexCoord[0].xy - offx) * 2.0 +\n"
" texture2D(texture, gl_TexCoord[0].xy + offx) * 2.0 +\n"
" texture2D(texture, gl_TexCoord[0].xy - offy) * 2.0 +\n"
" texture2D(texture, gl_TexCoord[0].xy + offy) * 2.0 +\n"
" texture2D(texture, gl_TexCoord[0].xy - offx - offy) * 1.0 +\n"
" texture2D(texture, gl_TexCoord[0].xy - offx + offy) * 1.0 +\n"
" texture2D(texture, gl_TexCoord[0].xy + offx - offy) * 1.0 +\n"
" texture2D(texture, gl_TexCoord[0].xy + offx + offy) * 1.0;\n"
"\n"
" gl_FragColor = gl_Color * (pixel / 16.0);\n"
"}";
et pour dessiner mes rectangle arrondi :
http://pastebin.com/nDFHPsc0cela se passe en 3 étapes , je dessine tout ce qui doit être l'ombre , avec le black shader , puis ensuite je blur le resultat avec le shader qui va bien , puis je dessine ma scène "regulière" devant le black/blur.
a toi d'adapté le resultat pour une ombre interne, pour un rectangle, tu peu te passer des shaders et faire un dégradé de couleur avec les vertices.