OpenGL ES 2.0纹理是透明的,但不会显示OpenGL内容

时间:2012-09-30 20:53:19

标签: ios opengl-es ios4 opengl-es-2.0

iOS 4 上使用 OpenGL ES 2.0

我有一个继承自 UIView OpenGL 视图。它位于提供背景的 UIImageView 前面。

我有一个带有透明度的。 png 图像,用于 OpenGL 纹理。

我遇到的问题是 OpenGL 视图中图像的透明度显示在 UIImageView 背景中的图像。我想在具有透明纹理的元素后面的 OpenGL 视图中显示内容。

正在渲染 OpenGL 纹理,但顶部具有透明纹理的任何部分都不会显示 OpenGL 纹理。它显示 UIImageView 背景。

我需要做什么才能使透明度在透明内容后面的 OpenGL 视图中显示内容?

修改

我重构了索引数组,所以所有带有透明纹理的元素都在最后,当我调用 glDrawElements 时,应该在所有不透明元素之后渲染。

仍然存在透明度问题。

我设置了一些数据,这样我有2个三角形的4个顶点和6个索引来绘制一个带有不透明纹理的正方形。 对于2个三角形,还有4个顶点和6个索引,用于绘制具有透明纹理的正方形,该正方形位于顶点/索引数组中的其他条目之后。透明元素坐标将其呈现在不透明元​​素的前面。

我可以看到透明元素,我也可以看到不透明元素的边缘从后面伸出来。 但是,不是显示位于透明元素后面的不透明元素,而是直接显示透明度并显示OpenGL视图后面的视图背景。

不透明的黄色方块:

Opaque yellow square

透明测试图像:

Transparent test image

透明图像覆盖不透明图像,但透明度显示背景而不是背后的不透明图像:

enter image description here enter image description here

1 个答案:

答案 0 :(得分:7)

你尝试过使用混合吗?像这样:

//draw your background scene here
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//draw your foreground scene here
glDisable(GL_BLEND);

-----------------编辑评论----------------

所以你想在片段着色器中进行混合:

vec4 color1 = texture2D(backgroundTexture, ...);
vec4 color2 = colorYouGetFromSecondaryTextureOrSomeOtherElement;

vec4 outputColor = color1*(1.0-color2.a) + color2*(color2.a);
outputColor.a = 1.0; //or some function of color1.a and color2.a

gl_FragColor = outputColor;

-----------------编辑2 -------------------------

另外考虑一下你的结果,我会说你忘记了管道中的一些东西。您可能使用2个或更多纹理,但只有您的第二个被绑定,导致我发布的片段片段全部为黑色,但是您的前景..您使用的是“活动纹理”吗?像这样:

- (void)bindFirstTexture {
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_1D, firstTextureID);
}
- (void)bindSecondTexture {
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, secondTextureID);
}

在创建之前和绘制多个纹理之前,您需要这两种绑定。