所以我一直在使用Android上的OpenGL ES 2.0,但现在遇到了一个我无法解决的问题。提前道歉,似乎我不允许发布更多这两个链接(还),所以我把我的三张图片放在Photobucket专辑here中。
我正在尝试创建一个由透明区域(“彩色玻璃”)包围的3D环境。为了看它是否有效,我还在其中放置了一个不透明的立方体。我启用了以下功能:
GLES20.glEnable(GLES20.GL_CULL_FACE);
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
现在图片看起来像这样(截图1)。不错,但不完全是我想要的:后面的一个(下)墙和右边的墙应该是可见的,因为我正在透视的墙是透明的。
然后我找到that并在绘制透明对象之前绘制不透明和GLES20.glDepthMask(true);
之前尝试使用GLES20.glDepthMask(false);
,并在绘制不透明对象时禁用混合。
结果(截图2)看起来很乱。但后来我有了另一个想法,不是要关闭写入深度缓冲区,而是在绘制透明对象时完全关闭GLES20.DEPTH_TEST
。
那(截图3)让我最接近我正在寻找的图片。您最终可以看到后墙和右侧壁,但是,由于在绘制不透明物时禁用了深度测试,因此后墙部分地覆盖了立方体,它不应该是这样。
有谁知道如何获得我正在寻找的效果?
答案 0 :(得分:1)
我认为我解决了它。我的意思是它在我的情况下有效,但我不知道这是不是巧合......
我像往常一样启用深度测试和混合。然后,在绘制时,我首先绘制不透明的形状,然后像之前一样绘制透明的形状。但是,在绘制透明形状时,我关闭GLES20.glDepthMask(..)
以不写入深度缓冲区,从而绘制所有未被不透明形状覆盖的透明形状。我之前做过(图2)并且它完全混乱,但我现在反过来 - 禁用透明形状的深度掩模,而不是不透明的形状。