2

iOS 4上使用OpenGL ES 2.0

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

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

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

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

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

编辑

我重组了索引数组,因此所有具有透明纹理的元素都在最后,并且在我调用glDrawElements时应该在所有不透明元素之后渲染。

仍然有透明度的问题。

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

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

不透明的黄色方块:

不透明的黄色正方形

透明测试图像:

透明测试图像

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

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

4

1 回答 1

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);
}

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

于 2012-10-01T07:50:42.090 回答