这是我在绘制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之上绘制。
我怎么能解决这个问题?
答案 0 :(得分:2)
是否启用了深度缓冲?如果是,那可能会导致碎片被丢弃(未通过Z测试),而不是与现有的碎片进行α混合。
如果您使用的是深度缓冲区,则需要按照从前到后的顺序绘制透明对象。
对于纯粹的2D场景,您甚至可能不需要深度缓冲区,您可以将其关闭:
glDisable(GL_DEPTH_TEST);