2

所以我一直在 Android 上使用 OpenGL ES 2.0,但现在遇到了一个我无法解决的问题。提前道歉,看来我不允许发布超过两个链接(还),所以我把我的三张图片放在 Photobucket 相册

我正在尝试创建一个由透明区域(“彩色玻璃”)包围的 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)。不错,但不完全是我想要的:后面的(下)墙和右边的墙应该是可见的,因为我正在看的墙是透明的。

然后我发现尝试GLES20.glDepthMask(true);在绘制不透明GLES20.glDepthMask(false);对象之前和绘制透明对象之前使用,以及在绘制不透明对象时禁用混合。

结果(截图 2)看起来很乱。但后来我有了另一个想法,不是关闭对深度缓冲区的写入,而是完全关闭GLES20.DEPTH_TEST,同时绘制透明对象。

那(截图3)让我最接近我正在寻找的图片。您终于可以看到后墙和右侧墙了,但是,由于在绘制不透明物体时深度测试被禁用,立方体被后墙部分覆盖,这是不应该的。

有谁知道如何获得我正在寻找的效果?

4

1 回答 1

1

我解决了。我的意思是它适用于我的情况,但我不知道这是否只是巧合......

我像往常一样启用深度测试和混合。然后,在绘制时,我先绘制不透明的形状,然后再绘制透明的形状,就像以前一样。但是,在绘制透明形状时,我GLES20.glDepthMask(..)关闭以不写入深度缓冲区,从而绘制所有未被不透明形状覆盖的透明形状。我以前做过(图 2),但它完全搞砸了,但我现在反过来做 - 禁用透明形状的深度蒙版,而不是不透明的形状。

于 2013-11-09T08:25:57.223 回答