1

这是我在绘制 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 形式的 Alpha 通道。

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

我该如何解决这个问题?

4

1 回答 1

2

是否启用了深度缓冲?如果是这样,那可能会导致片段被丢弃(未通过 Z 测试),而不是与已经存在的片段进行 alpha 混合。

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

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

glDisable(GL_DEPTH_TEST);
于 2011-09-10T17:47:56.973 回答