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

GRW*_*GRW 2 opengl-es ios4 ios opengl-es-2.0

iOS 4上使用OpenGL ES 2.0.

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

我有一个 .png图像具有透明度,我用于OpenGL纹理.

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

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

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

编辑:

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

仍然存在透明度问题.

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

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

不透明的黄色方块:

不透明的黄色方块

透明测试图像:

透明的测试图像

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

在此输入图像描述在此输入图像描述

Mat*_*lak 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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;
Run Code Online (Sandbox Code Playgroud)

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

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

- (void)bindFirstTexture {
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_1D, firstTextureID);
}
- (void)bindSecondTexture {
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, secondTextureID);
}
Run Code Online (Sandbox Code Playgroud)

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