繁体   English   中英

OpenGL ES 2.0纹理是透明的,但后面没有显示OpenGL内容

[英]OpenGL ES 2.0 texture is transparent, but does not show OpenGL content behind

iOS 4上使用OpenGL ES 2.0

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

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

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

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

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

编辑

我重组了索引数组,以便所有具有透明纹理的元素都出现在末尾,当我调用glDrawElements时应在所有不透明元素之后呈现它们

透明度仍然存在问题。

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

我可以看到透明元素,也可以看到不透明元素的边缘从后面伸出。 但是,与其显示紧邻在透明元素后面的不透明元素,不如说它一直贯穿并显示OpenGL视图后面的视图背景。

不透明的黄色方块:

不透明的黄色正方形

透明测试图像:

透明测试图像

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

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

您尝试使用一些混合吗? 像这样的东西:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM