OpenGL,alpha打包与打包缓冲区和多个纹理

时间:2013-07-10 22:11:00

标签: sorting opengl alphablending depth-buffer

我正在绘制一个只包含矩形的相当简单的2D场景。我有一个FloatBuffer,我为每个顶点放置X,Y,Z,R,G,B,A,U和V数据。 我使用glDrawArraysGL_TRIANGLE_STRIP进行绘制,使矩形与简并顶点分开。

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

我使用正交投影,因此我可以使用Z坐标和GL_DEPTH_TEST来设置与绘制顺序无关的深度。

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

听起来你可能需要做Depth PeelingHere's a PDF显示了如何操作。