1

いくつかのテクスチャをレイヤー化された方法でビデオにオーバーレイする必要があります(つまり、最初のテクスチャが下に表示され、2番目のテクスチャが両方とも半透明の場合など)。テクスチャはすべて異なるZ値を持っているため、そこで競合が発生することはありません。画像は千の言葉を話すので、以下に1つ添付しました。

代替テキスト ご覧のとおり、矢印は半透明で、互いに交差しています。ただし、青と赤の矢印だけが相互作用しているようです。引数として、赤い矢印のaz(この場合は垂直)値が4、青が6、白が10であるとします。使用しているブレンド関数は次のとおりです gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);GL_DEPTH_TEST有効になっています。赤と青のテクスチャと同じように相互作用するすべてのオーバーレイされたテクスチャを探しています。つまり、白い矢印の下に赤い矢印が表示され、暗い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);
}
4

1 に答える 1

2

アルファブレンディングの場合、正しい順序で描画するか、アディティブブレンディングで描画する必要があります。

これを行うための一般的なアプローチは、アルファブレンドアイテムを非アルファブレンドアイテムから分離することです。すべての標準アイテムをレンダリングし、アルファブレンドされたアイテムを後ろから前に並べ替えて、この順序でレンダリングします。フレームレートが問題になる場合(たとえば、並べ替えるアイテムが多い場合)、複数のフレームにまたがって並べ替えることができます。

于 2010-11-11T14:34:28.773 に答える