openGL中的层、深度和混合问题

openGL中的层、深度和混合问题,opengl,alphablending,layer,depth,Opengl,Alphablending,Layer,Depth,我需要以分层的方式将一些纹理叠加到视频上(即,第一个纹理应该出现在下面,第二个纹理都是半透明的,等等)。 这些纹理都有不同的Z值,因此应该没有冲突。图像可以表达千言万语,因此我在下面附上了一个: 如您所见,箭头是半透明的,相互交叉。然而,似乎只有蓝色和红色箭头相互作用。为了便于讨论,让我们假设红色箭头的z(在本例中为垂直)值为4,蓝色箭头为6,白色箭头为10。 我使用的混合函数是: gl.glBlendFunc(gl.gl\u SRC\u ALPHA,gl.gl\u ONE\u减去SRC\u

我需要以分层的方式将一些纹理叠加到视频上(即,第一个纹理应该出现在下面,第二个纹理都是半透明的,等等)。 这些纹理都有不同的Z值,因此应该没有冲突。图像可以表达千言万语,因此我在下面附上了一个:

如您所见,箭头是半透明的,相互交叉。然而,似乎只有蓝色和红色箭头相互作用。为了便于讨论,让我们假设红色箭头的z(在本例中为垂直)值为4,蓝色箭头为6,白色箭头为10。 我使用的混合函数是:
gl.glBlendFunc(gl.gl\u SRC\u ALPHA,gl.gl\u ONE\u减去SRC\u ALPHA)
并且启用了
GL\u DEPTH\u TEST
。 我正在寻找所有的重叠纹理互动一样,红色和蓝色的。i、 e.您可以看到白色箭头下方的红色箭头,以及在较暗的2个红色箭头交叉处显示较暗的红色。谁能给我指出正确的方向吗

编辑:下面是用于为每个帧渲染设置openGL的代码

public void display(final GL gl, final GLProjection projection, final FieldMask fieldMask)
{
    layerTextureShader.updateShader(gl, projection, fieldMask);
    if (useMask)
    {
        layerMaskShader.updateShader(gl, projection, fieldMask);
    }

    gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);

    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getVertexBufferObject());
    gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 3 * 4, getVertices(), GL.GL_STREAM_DRAW);
    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);

    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getTexCoordBufferObject());
    gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 2 * 4, getTexCoords(), GL.GL_STREAM_DRAW);
    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);

    gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, getIndicesBufferObject());
    gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, getNoOfIndices() * 4, getIndices(), GL.GL_STREAM_DRAW);
    gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);

    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getColorBufferObject());
    gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 4 * 4, getColors(), GL.GL_STREAM_DRAW);
    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);

    if (useMask)
    {
        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getMaskColorBufferObject());
        gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 4 * 4, getMaskColors(), GL.GL_STREAM_DRAW);
        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
    }

    gl.glEnable(GL.GL_TEXTURE_2D);
    gl.glActiveTexture(GL.GL_TEXTURE0);
    gl.glBindTexture(GL.GL_TEXTURE_2D, textureId);

    gl.glEnable(GL.GL_BLEND);
    gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);

    if (useMask)
    {
        gl.glBlendEquation(GL.GL_MIN);

        layerMaskShader.use(gl);

        display(gl, true);

        layerMaskShader.release(gl);
    }

    gl.glBlendEquation(GL.GL_MAX);

    layerTextureShader.use(gl);

    display(gl, false);

    layerTextureShader.release(gl);

    gl.glDisable(GL.GL_TEXTURE_2D);

    gl.glDepthMask(true);

    gl.glDisable(GL.GL_BLEND);
}

对于alpha混合,您需要确保以正确的顺序绘制它们,或者使用加法混合绘制它们


执行此操作的常用方法是将alpha混合项与非alpha混合项分开。渲染所有标准项目,将alpha混合项目从后向前排序,并按顺序渲染。如果帧率是一个问题(例如,如果您有许多项目要排序),您可以跨多个帧进行排序。

感谢您的回复。我可以确认对象正在按照从后到前的顺序进行渲染。抱歉,我应该在第一篇文章中提到。你的纹理环境模式设置为调制吗<代码>glTexEnvf(GL_纹理_环境,GL_纹理_环境模式,GL_调制)不是,但现在是。然而,问题仍然存在。非常感谢您的帮助。看起来您正在使用
glBlendEquation
进行掩蔽,但没有将其设置回
glBlendEquation(GL\u FUNC\u ADD)用于正常混合。除非我看错了密码。你,我的好先生,是个天才!!!非常感谢。我还没想到呢!