为什么alpha混合在ortho中不起作用?

时间:2011-09-10 17:14:07

标签: visual-c++ opengl alpha blending orthographic

这是我在绘制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的某些部分。两种纹理都将alpha通道设为RGBA。

问题是,Quad1& Quad2正确地使用alpha覆盖3D对象,但Quad1的alpha位于Quad2之上时不起作用。它仅仅像RGB一样在Quad2之上绘制。

我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:2)

是否启用了深度缓冲?如果是,那可能会导致碎片被丢弃(未通过Z测试),而不是与现有的碎片进行α混合。

如果您使用的是深度缓冲区,则需要按照从前到后的顺序绘制透明对象。

对于纯粹的2D场景,您甚至可能不需要深度缓冲区,您可以将其关闭:

glDisable(GL_DEPTH_TEST);