OpenGLのレイヤー、深さ、ブレンドの問題
-
08-10-2019 - |
質問
レイヤードファッションでいくつかのテクスチャをビデオにオーバーレイする必要があります(つまり、最初のテクスチャは、半透明の両方である場合は2番目のテクスチャなどの下に表示されます)。テクスチャにはすべて異なるZ値があるため、そこに競合がないはずです。画像は千の言葉を話すので、私は以下に添付しました:
ご覧のとおり、矢印は半透明です。ただし、青と赤の矢だけが相互作用しているようです。議論のために、赤い矢印には4のaz(垂直)値があるとしましょう。 gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
と GL_DEPTH_TEST
有効になっています。私は、赤と青のものと同じように相互作用するすべてのオーバーレイテクスチャを探しています。つまり、白い矢の下の赤い矢印を見ることができ、暗い赤い赤い赤い矢印が横になる場所が示されます。誰かが私を正しい方向に向けることができますか?
編集:以下は、各フレームレンダリングの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ブレンドには、正しい順序でそれらを描画するか、追加のブレンドでそれらを描く必要があります。
これを行うための一般的なアプローチは、アルファブレンドアイテムを非アルファブレンドアイテムから分離することです。すべての標準アイテムをレンダリングし、アルファブレンドのアイテムを背面から前面に並べ替えて、その順序でレンダリングします。フレームレートが問題である場合(たとえば、ソートするアイテムがたくさんある場合)、複数のフレームにわたって並べ替えることができます。
所属していません StackOverflow