ммм по-идее так должно работать
glEnable(GL_STENCIL_TEST);//включаем трафарет
//мы в любом случае будем писать в трафарет
glStencilFunc(GL_ALWAYS, 0, 255);
//в том месте где рисуется трафарет значение буфера заменяем на 1
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
level_draw();//уровень является трафаретом-только на нем видна тень
// тень будет рисоваться только в тех местах,где значение в буфере 1
glStencilFunc(GL_EQUAL, 1, 255);
glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO);
player_shadow_draw();
enemy_air_shadow_draw();
glDisable(GL_STENCIL_TEST);//отключаем трафарет