Pregunta

Tengo una textura OpenGL RGBA y abono otra textura RGBA utilizando un objeto framebuffer. El problema es que si uso las funciones de mezcla habituales con glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), el blit resultante hace que la textura alfa de destino cambie, haciéndolo ligeramente transparente para los lugares donde anteriormente alfa era 1. Me gustaría que la superficie alfa de destino nunca cambiara, pero de lo contrario el efecto sobre los valores RGB debería ser exactamente como con GL_SRC_ALPHA y GL_ONE_MINUS_SRC_ALPHA . Por lo tanto, las funciones del factor de mezcla deben ser (As, As, As, 0) y (1-As, 1-As, 1-As, 1). ¿Cómo puedo lograr eso?

¿Fue útil?

Solución

Puedes configurar los modos de mezcla para RGB y alfa en diferentes ecuaciones:

void glBlendFuncSeparate(
    GLenum srcRGB, 
    GLenum dstRGB, 
    GLenum srcAlpha, 
    GLenum dstAlpha);

En su caso, desea utilizar las siguientes enumeraciones:

  glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);

Tenga en cuenta que es posible que deba importar la función glBlendFuncSeparate como una extensión. Aunque es seguro hacerlo. La función está alrededor por mucho tiempo. Es parte de OpenGL 1.4

Otra forma de hacer lo mismo es deshabilitar la escritura en el canal alfa usando glColorMask:

void glColorMask( GLboolean red,
                  GLboolean green,
                  GLboolean blue,
                  GLboolean alpha )

podría ser mucho más lento que glBlendFuncSeparate porque los controladores OpenGL optimizan las funciones más utilizadas y glColorMask es una de las funciones OpenGL poco utilizadas.

Si no tienes suerte, incluso puedes terminar con la emulación de renderización de software llamando a las funciones de bicho raro :-)

Otros consejos

Tal vez podría usar glColorMask ()? Le permite habilitar / deshabilitar la escritura en cada uno de los cuatro componentes de color.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top