1

我正在绘制一个仅包含矩形的相当简单的 2D 场景。我有一个 FloatBuffer,我将每个顶点的 X、Y、Z、R、G、B、A、U 和 V 数据放入其中。glDrawArrays我使用and进行绘制GL_TRIANGLE_STRIP,将矩形与退化的顶点分开。

为了方便使用多个纹理,我为每个纹理的绘制调用保留了单独的浮点数组。贴图绑定,float数组放入FloatBuffer,我绘制。然后绑定下一个纹理,并继续此过程,直到我为此渲染绘制了所有纹理。

我使用正交投影,因此我可以使用 Z 坐标并GL_DEPTH_TEST独立于绘制顺序设置深度。

要使用 alpha 混合,互联网上的每条建议似乎都在说:

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

对于每个纹理的“绘制”,这都可以正常工作,因为在绘制之前,我在缓冲区中从后到前对绘制调用进行了排序。我无法在部分透明的纹理 1 下正确绘制纹理 2,因为深度测试和纹理 1 是在纹理 2 之前绘制的。texture1 切断了 texture2 的重叠部分,因为深度测试表明 texture1 位于 texture2 的前面。

我看到的唯一方法是1)在整个程序中只使用1个纹理,2)不使用透明纹理。这些都不是可接受的选择。

基本上,我需要一种方法来进行 alpha 混合,而无需从后到前排序。这可能吗?

4

1 回答 1

1

听起来您可能需要进行深度剥离。这是一个显示如何执行此操作的 PDF 。

于 2013-07-11T04:24:08.610 回答