OpenGL – masque avec plusieurs textures

J’ai implémenté le masquage dans OpenGL selon le concept suivant:

  • Le masque est composé de couleurs noir et blanc.
  • Une texture de premier plan ne doit être visible que dans les parties blanches du masque.
  • Une texture de fond ne doit être visible que dans les parties noires du masque.

Je peux faire fonctionner la partie blanche ou la partie noire comme supposé en utilisant glBlendFunc (), mais pas les deux en même temps, car le calque de premier plan se fond non seulement sur le masque, mais également sur le calque d’arrière-plan.

Y at-il quelqu’un qui sait comment y parvenir de la meilleure façon? J’ai cherché sur le net et lu quelque chose sur les fragment shaders. Est-ce le chemin à parcourir?

Cela devrait fonctionner:

glEnable(GL_BLEND); // Use a simple blendfunc for drawing the background glBlendFunc(GL_ONE, GL_ZERO); // Draw entire background without masking drawQuad(backgroundTexture); // Next, we want a blendfunc that doesn't change the color of any pixels, // but rather replaces the framebuffer alpha values with values based // on the whiteness of the mask. In other words, if a pixel is white in the mask, // then the corresponding framebuffer pixel's alpha will be set to 1. glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO); // Now "draw" the mask (again, this doesn't produce a visible result, it just // changes the alpha values in the framebuffer) drawQuad(maskTexture); // Finally, we want a blendfunc that makes the foreground visible only in // areas with high alpha. glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA); drawQuad(foregroundTexture); 

C’est assez délicat, alors dites-moi si quelque chose n’est pas clair.

N’oubliez pas de demander un tampon alpha lors de la création du contexte GL. Sinon, il est possible d’obtenir un contexte sans tampon alpha.

Edit: Ici, j’ai fait une illustration. illustration

Edit: Depuis l’écriture de cette réponse, j’ai appris qu’il existe de meilleures façons de procéder:

  • Si vous êtes limité au pipeline à fonction fixe d’OpenGL, utilisez des environnements de texture.
  • Si vous pouvez utiliser des shaders, utilisez un fragment shader.

La manière décrite dans cette réponse fonctionne et n’est pas particulièrement mauvaise en performances que ces 2 meilleures options, mais elle est moins élégante et moins flexible.