хм
//цвета теней не смешиваються!!!
glEnable(GL_STENCIL_TEST);//включаем трафарет
//мы в любом случае будем писать в трафарет
glStencilFunc(GL_ALWAYS, 1, 255);
//в том месте где рисуется трафарет значение буфера заменяем на 1
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
//ну вообще-то нам надо отсечь рисования прозрачных пикселей уровня
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.5f); //выводим только те пиксели уровня у которых alpha > 0.5f
level_draw();//уровень является трафаретом-только на нем видна тень
// тень будет рисоваться только в тех местах,где значение в буфере 1
glStencilFunc(GL_EQUAL, 1, 255);
glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO);
glAlphaFunc(GL_GREATER,0.2f); //выводим только те пиксели тени у которых alpha > 0.2f
player_shadow_draw();
enemy_air_shadow_draw();
glDisable(GL_ALPHA_TEST);
glDisable(GL_STENCIL_TEST);//отключаем трафарет
там где 0.2f надо будет эксперементировать, в принципе если тени наложатся то в границе наложения будут небольшие баги, имхо тени надо сумировать