0

我在 iOS 上遇到了 OpenGL ES 2.0 的半透明问题。我的场景比较简单。它由一个立方体网格组成,其中一些应该是实心的,而其他的应该是半透明的。我从下面的代码开始设置 OpenGL。

glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

由于深度测试和剔除,这会导致某些角度的透明度不正确。请看下面的两张图片

启用正确的透明度/剔除和深度测试

不正确的透明度/启用了剔除和深度测试

我试图禁用卷曲和深度测试并启用 alpha 测试。结果是正确的透明度,但没有纹理(见下图)。

//glEnable(GL_CULL_FACE);
//glEnable(GL_DEPTH_TEST);
//glDepthFunc(GL_LEQUAL);


glAlphaFunc(GL_GREATER, 0.5);
glEnable(GL_ALPHA_TEST);


glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

在此处输入图像描述

我正在使用 GLKit 加载纹理并使用 GLKBaseEffect 来渲染场景。是否有人提示如何在所有视角下以正确的透明度实现与第一张图像相同的结果?谢谢 :)

4

1 回答 1

3

您的主要两个选择是:

  1. 对场景中的所有多边形进行排序,并确保没有多边形与其他多边形相交(因为这样您就无法对它们进行排序)

  2. 请改用与排序无关的混合模式,例如加法或减法混合。

如果您真的只想要一个立方体网格,那么将渲染顺序更改为适合任何视点应该不会太棘手,因为您只需要以不同的顺序遍历立方体而不是实际对任何东西进行排序。

于 2012-12-09T22:44:58.613 回答