Почему альфа-смешивание не работает в орто?

Вот как я включаю ортопроекцию после рисования 3D-объектов:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,Screen_Width,Screen_Height,0,0,1);

А вот как я включаю смешивание и отрисовываю текстуры в орто после отрисовки 3D-объектов:

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
glColor4f(1,1,1,1);

glBindTexture(GL_TEXTURE_2D,Texture1);
glBegin(GL_QUADS);
//draw 1st quad
glEnd();

glBindTexture(GL_TEXTURE_2D,Texture2);
glBegin(GL_QUADS);
//draw 2nd quad
glEnd();

glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);

Quad1 немного больше, чем Quad2, и покрывает некоторые части Quad2. Обе текстуры имеют альфа-канал как RGBA.

Проблема в том, что Quad1 и Quad2 правильно накладывают 3D-объекты с альфа-каналом, но альфа Quad1 не работает, когда он находится поверх Quad2. Он рисует поверх Quad2, как только RGB.

Как я могу решить эту проблему?


person jondinham    schedule 10.09.2011    source источник


Ответы (1)


Включена ли буферизация глубины? Если это так, это может привести к тому, что фрагменты будут отброшены (не пройден Z-тест) вместо альфа-смешения с тем, что уже есть.

Если вы используете буфер глубины, вам нужно рисовать прозрачные объекты в обратном порядке.

Для чисто 2D-сцены вам может даже не понадобиться буфер глубины, и вы можете просто отключить его:

glDisable(GL_DEPTH_TEST);
person Thomas    schedule 10.09.2011