【发布时间】:2013-06-27 17:22:50
【问题描述】:
我正在使用 OpenGL 和 C++ 编写一个简单的 2D 框架,现在遇到了与透明纹理和混合相关的问题。我已将问题简化为以下问题。
我有两种纹理:地砖和鱼骨。后者包含透明像素。我将 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 模拟器上测试我的程序。
【问题讨论】:
标签: ios opengl-es opengl-es-2.0 transparency