OpenGL: Comment faire le blitting RGBA- > RGBA sans changer d'alpha de destination

StackOverflow https://stackoverflow.com/questions/146140

  •  02-07-2019
  •  | 
  •  

Question

J'ai une texture OpenGL RGBA et j'y applique une autre texture RGBA à l'aide d'un objet framebuffer. Le problème est que si j'utilise les fonctions de mélange habituelles avec glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), le résultat obtenu provoque la modification de la texture de destination alpha, ce qui la rend légèrement transparente pour les endroits où alpha était auparavant égal à 1. Je souhaite que la surface de destination alpha ne change jamais, mais sinon l'effet sur les valeurs RVB devrait être identique à celui obtenu avec GL_SRC_ALPHA et GL_ONE_MINUS_SRC_ALPHA . Les fonctions de facteur de mélange devraient donc être (As, As, As, 0) et (1-As, 1-As, 1-As, 1). Comment puis-je y parvenir?

Était-ce utile?

La solution

Vous pouvez définir les modes de fusion pour RVB et alpha sur 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 devrez peut-être importer la fonction glBlendFuncSeparate en tant qu’extension. C'est sûr de le faire cependant. La fonction existe depuis très longtemps. Cela fait partie d'OpenGL 1.4

Une autre méthode consiste à désactiver l'écriture sur le canal alpha à l'aide de glColorMask:

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

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

Si vous êtes malchanceux, vous pouvez même vous retrouver avec une émulation de rendu logiciel en appelant des fonctions oddball: -)

Autres conseils

Vous pouvez peut-être utiliser glColorMask ()? Cela vous permet d'activer / de désactiver l'écriture sur chacun des quatre composants couleur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top