在 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视图后面的视图背景。
不透明的黄色方块:
透明测试图像:
透明图像覆盖不透明图像,但透明度显示背景而不是背后的不透明图像:
答案 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);
}
在创建之前和绘制多个纹理之前,您需要这两种绑定。