GRW*_*GRW 2 opengl-es ios4 ios 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视图后面的视图背景.
不透明的黄色方块:

透明测试图像:

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


你尝试过使用一些混合吗?像这样的东西:
//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)
在创建之前和绘制多个纹理之前,您需要这两种绑定.
| 归档时间: |
|
| 查看次数: |
2807 次 |
| 最近记录: |