Domanda

devo sovrapporre alcune texture su un video in modo stratificato (cioè la prima struttura dovrebbe apparire sotto, la seconda trama quando entrambi sono semi-trasparente, ecc). Le texture hanno tutti valori Z diversi quindi non ci dovrebbero essere conflitti lì. Immagini parlano più di mille parole così Ho allegato uno sotto:

alt text Come si può vedere, le frecce sono semi-trasparenti sono incrociarsi. Solo le frecce blu e rosso sembrano interagire comunque. Per motivi argomenti, lascia dire le frecce rosse hanno una z (verticale in questo caso) valore di 4, il blu 6 e il bianco 10. La funzione di miscela che sto usando è:  gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); e GL_DEPTH_TEST è abilitato. Sto cercando tutte le texture sovrapposti di interagire lo stesso di quelle rosse e blu fanno. cioè Si può vedere la freccia rossa sotto la freccia bianca e per una più scura rosso da mostrare dove i più scuro 2 frecce rosse incrociano. Qualcuno può punto me nella giusta direzione?

EDIT:. Sotto è il codice utilizzato per impostare openGL per ciascun frame rendering

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);
}
È stato utile?

Soluzione

Per alpha blending è necessario per garantire la loro disegno nell'ordine corretto o disegnare con la miscelazione di additivi.

Un approccio comune per farlo è quello di separare l'alfa articoli mescolato elementi dal non-alfa miscelati. Rendere tutti i vostri articoli standard, ordinare i vostri alpha-blending da dietro in avanti e renderli in questo ordine. Se framerate sono un problema (ad esempio se si dispone di molti elementi per ordinare) è possibile ordinare su più fotogrammi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top