tutorial texture texturas multiples example c++ opengl mask blending

c++ - texture - OpenGL: máscara con múltiples texturas



texture mapping opengl (1)

Esto debería funcionar:

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);

Esto es bastante complicado, así que dime si algo no está claro.

No olvide solicitar un búfer alfa al crear el contexto GL. De lo contrario, es posible obtener un contexto sin un buffer alfa.

Editar: Aquí, hice una ilustración.

Editar: Desde que escribí esta respuesta, aprendí que hay mejores formas de hacer esto:

  • Si está limitado a la canalización de función fija de OpenGL, utilice entornos de textura
  • Si puede usar sombreadores, use un sombreador de fragmentos.

La forma descrita en esta respuesta funciona y no es particularmente peor en rendimiento que estas 2 mejores opciones, pero es menos elegante y menos flexible.

Implementé enmascaramiento en OpenGL de acuerdo con el siguiente concepto:

  • La máscara está compuesta de colores blanco y negro.
  • Una textura de primer plano solo debe ser visible en las partes blancas de la máscara.
  • Una textura de fondo solo debe ser visible en las partes negras de la máscara.

Puedo hacer que la parte blanca o la parte negra funcionen como se supone utilizando glBlendFunc (), pero no las dos al mismo tiempo, porque la capa de primer plano no solo se combina con la máscara, sino también con la capa de fondo.

¿Hay alguien que sepa cómo lograr esto de la mejor manera? He estado buscando en la red y he leído algo sobre los sombreadores de fragmentos. ¿Es este el camino a seguir?