いくつかのテクスチャをレイヤー化された方法でビデオにオーバーレイする必要があります(つまり、最初のテクスチャが下に表示され、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);
}