2008-09-28 7 views
2

J'ai une texture OpenGL RGBA et j'y mets une autre texture RGBA en utilisant un objet framebuffer. Le problème est que si j'utilise les fonctions de fusion habituelles avec glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), le blit qui en résulte modifie la texture de destination alpha, le rendant légèrement transparent pour les endroits où alpha était auparavant 1. Je voudrais que l'alpha de surface de destination ne change jamais, mais sinon l'effet sur les valeurs RVB devrait être exactement comme avec GL_SRC_ALPHA et GL_ONE_MINUS_SRC_ALPHA. Ainsi, les fonctions du facteur de mélange doivent être (As, As, As, 0) et (1-As, 1-As, 1-As, 1). Comment puis-je y parvenir?OpenGL: Comment faire un RGBA-> RGBA sans modifier la destination alpha

Répondre

7

Vous pouvez définir les mélanges-modes pour RVB et alpha à différentes équations:

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

Dans votre cas, vous souhaitez utiliser les énumérations suivantes:

glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE); 

Notez que vous pouvez avoir à importez la fonction glBlendFuncSeparate en tant qu'extension. C'est sûr de le faire cependant. La fonction est là depuis très longtemps. Il fait partie d'OpenGL 1.4

Une autre façon de faire la même chose est de désactiver l'écriture à l'alpha-canal à l'aide glColorMask:

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

Il pourrait être beaucoup plus lent que glBlendFuncSeparate parce que les pilotes OpenGL optimisent la Les fonctions les plus couramment utilisées et glColorMask est l'une des fonctions OpenGL rarement utilisées.

Si vous êtes malchanceux, vous pouvez même finir avec l'émulation de rendu logiciel en appelant des fonctions :-) loufoques

+3

J'ai trouvé le soutien glColorMask() pour être en général tout à fait décent. –

1

Peut-être que vous pourriez utiliser glColorMask()? Il vous permet d'activer/désactiver l'écriture pour chacun des quatre composants de couleur.

Questions connexes