我正在用OpenGL和C++编写一个简单的2D框架,现在遇到了与透明纹理和混合有关的问题。我已经将我的问题减少到了以下。OpenGL背景清晰的颜色渗入透明纹理
我有两个纹理:地砖和鱼骨。后者包含透明像素。我把我的OpenGL鲜明的色彩,以“绿色透明”,使深度测试和混合是这样的:
glClearColor(0, 1, 0, 0)
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
有两个调用glDrawElements()
我画鱼,然后在地板上。鱼具有较高的Z值,因此应放置在地砖前面。 This is the result。
很显然,我不希望这样的鱼周围有绿色的盒子。我认为会发生什么情况是,鱼的像素与绘制时帧缓冲区的颜色渲染缓冲区中的任何内容混合,并且恰好是纯绿色(由于glClearColor
和glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
)。对于鱼纹理中的每个透明像素,我都希望这种混合能够解析为透明(因为我已经设置了透明的透明颜色),但正如你所看到的那样,这不是发生了什么。
如果我先画地板,然后是鱼,它的作品as expected。
我的片段着色器是死的简单:
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
void main(void) {
gl_FragColor = texture2D(Texture, TexCoordOut);
}
难道我真的要管理绘制顺序手动(用Z排序坐标)或者是有办法解决这个问题? OpenGL深度缓冲系统不是专为解决这个问题而设计的吗?
我正在通过Xcode在iOS模拟器上测试我的程序。
有些方法可以在不进行排序的情况下进行透明化(例如http://www.eng.utah.edu/~cs5610/lectures/OrderIndependentTransparency.pdf),但我认为它们对于这里描述的情况是过度的,所以我认为你的答案是好的。 – GuyRT