我正在使用 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 值,因此应放置在地砖前面。这就是结果。
显然,我不希望像这样围绕鱼的绿色框。我认为发生的情况是鱼像素在绘制时与帧缓冲区的颜色渲染缓冲区中的任何内容混合,并且恰好是纯绿色(由于glClearColor
和glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
)。对于鱼纹理中的每个透明像素,我希望这种混合能够解析为透明(因为我设置了透明的清晰颜色),但正如您所见,这不是正在发生的事情。
如果我先画地板,然后画鱼,它会按预期工作。
我的片段着色器非常简单:
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
void main(void) {
gl_FragColor = texture2D(Texture, TexCoordOut);
}
我真的必须手动管理绘图顺序(按 Z 坐标排序)还是有办法解决这个问题?OpenGL深度缓冲系统不是设计来解决这个问题的吗?
我正在通过 Xcode 在 iOS 模拟器上测试我的程序。