¿La forma más simple de representar la image sobre otra con otra image utilizada como máscara en OpenGL?

El efecto que estoy buscando es tener una sola image de background grande que esté siempre visible (en alfa completo) y luego mostrar una segunda image (lo que llamo un map claro o un map especular) que se muestra parcialmente en la parte superior en function de una tercera image (que es efectivamente una máscara).

El efecto es similar a este efecto, excepto que en lugar de simplemente oscurecer o aclarar la image de background con la tercera image, necesita enmascarar la segunda sin afectar a la primera.

La tercera image es la única que se mueve, por lo tanto, no es una opción la posibilidad de hornear la tercera image alfa en la segunda image.

Si mi explicación no es clara, daré ejemplos visuales cuando tenga más time.

Preferiría no seguir una ruta de sombreado, ya que no me he enseñado esta área todavía, así que a less que tenga demasiado, prefiero intentarlo con una simple mezcla alfa. Feliz de usar un enfoque de sombreado.

Aclamaciones.

Adicional

Estas tercera imágenes son obviamente fonts de luz que se proyectan sobre la primera image que muestra la información especular de la segunda image para simular la luz 'shiny' de los objects en la primera image. La solución que implemente necesitará permitir que dos fonts de luz se superpongan, así que mis pensamientos actuales son que los valores alfa de las dos imágenes deberán combinarse (¿se agregó?) Para producir una image final que enmascare la segunda image.

No te preocupes por cosas como luces de colors. Para esta técnica, las luces se consideran blancas.

Para funciones fijas, esto podría ser lo que quieras:

https://stackoverflow.com/questions/5097145/opengl-mask-with-multiple-textures

Básicamente, use los modos de fusión (y el uso adecuado de los canales de color frente al canal alfa) para escribir una máscara en su backbuffer y luego enmascare una image de primer plano.

Con los sombreadores, puede simplemente proporcionar la máscara / textura de luz como una input al sombreador de fragments, consultar las texturas de input "reales" (para sprites o lo que sea) y la textura de la máscara y luego descartar fragments o mezclarlos adecuadamente.

Ha pasado el time suficiente desde que utilicé GLSL que es probable que el siguiente código sea sintácticamente inválido y sin dudas idiomático, pero la esencia es:

// mask.fragment.glsl layout(location=0) uniform sampler2D sMask; layout(location=1) uniform sampler2D sSprite; in vec2 aTexCoord; in vec4 aColor; layout(location=0) out vec4 rtColor; void main() { vec4 mask = texture2D(sMask, gl_FragCoord.xy); vec4 sprite = texture2D(sSprite, aTexCoord); rtColor = mask * sprite * aColor; } 

Puede cambiar la forma en que usa la máscara para hacerla basada en color, basada en alfa, lo que sea. Usando ese fragment, usaría el canal alfa de la textura de la máscara para hacer que los detalles de la piel y el color cambien el color de la salida, lo que respalda la iluminación de color.