【问题标题】:OpenGL, alpha blending with packed buffer and multiple texturesOpenGL,与打包缓冲区和多个纹理的 alpha 混合
【发布时间】:2013-07-10 22:10:59
【问题描述】:

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

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

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

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

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 混合,而无需从后到前排序。这可能吗?

【问题讨论】:

    标签: sorting opengl alphablending depth-buffer


    【解决方案1】:

    听起来你可能需要Depth PeelingHere's a PDF 展示了如何做到这一点。

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多