Question

J'ai une texture chargé dans la mémoire de format RGBA avec différentes valeurs alpha.

L'image est chargée de la manière suivante:

 GLuint texture = 0;
 glGenTextures(1, &texture);
 glBindTexture(GL_TEXTURE_2D, texture);
 self.texNum = texture;

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.imageWidth, self.imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, [self.imageData bytes]);

Je veux savoir comment je peux dessiner cette texture, de sorte que le canal alpha de l'image est traitée comme toutes les 1 et la texture est dessiné comme une image RVB.

Considérons l'image de base:

http://www.ldeo.columbia.edu/~jcoplan/alpha/base.png

Cette image est une progression de 0 à 255 alpha et a la valeur RVB de 255,0,0 tout au long de

Cependant si j'ai dessiner avec un mélange désactivé, j'obtiens une image qui ressemble à ceci:www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

Quand ce que je veux vraiment, c'est une image qui ressemble à ceci:www.ldeo.columbia.edu/~jcoplan/alpha/corriger.png

J'apprécierais vraiment quelques conseils pour l'avoir ignorer le canal alpha complètement.Remarque que je ne peux pas il suffit de charger l'image en RGB, d'abord parce que j'ai besoin d'un canal alpha à d'autres points.

Edit:J'ai essayé d'utiliser GL_COMBINE à résoudre mon problème en tant que tel:

glColorf(1,1,1,1);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 
[self drawTexture];

Mais toujours pas de chance, il attire noir rouge encore.

Était-ce utile?

La solution

J'ai une texture chargée dans la mémoire du format RGBA avec diverses valeurs alpha

GLDISABLE (GL_BLEND)

Cependant, si je le dessine avec mélange handicapé, j'obtiens une image qui ressemble à: www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

Cela se produit car dans votre image source, tous les pixels transparents sont noirs.C'est un problème avec votre texture / image, ou peut-être avec la fonction de chargeur, mais ce n'est pas un problème OpenGL.

Vous pouvez probablement essayer de le réparer en utilisant Gltexenv (GL_Combine ...) (c.-à-d. Mélanger la couleur de la texture avec une couleur sous-jacente à base de canal alpha), mais depuis que je n'ai pas fait quelque chose comme ça, je ne suis pas totalement sûr, je ne suis pas totalement sûr,et ne peut pas vous donner des opérandes exacts.Il était possible dans Direct3D9 (à l'aide de D3DTOP_MODULATEALPHA_ADDCOLOR), il existe donc probablement un moyen de le faire dans OpenGL.

Autres conseils

Vous ne devez pas désactiver le mélange, mais utiliser Glblendfunc avec appropriéParamètres:

glBlendFunc(GL_ONE, GL_ZERO);

Ou vous pourriez dire à OpenGL de télécharger uniquement les canaux RVB de votre image à l'aide de

glPixelStorei(GL_UNPACK_ALIGNMENT, 4)

avant d'appeler glTexImage2D avec format GL_RGB.Il fera sauter le quatrième octet de chaque pixel, c'est à direle canal alpha.

J'ai eu un problème similaire et j'ai découvert que c'était parce que la chargement de l'image iOS faisait prudencily sur les valeurs de la RBG (comme indiqué dans certaines des autres réponses et commentaires ici).J'aimerais savoir s'il existe une façon de désactiver la pré-multiplication, mais dans l'intervalle, je suis "non pré-multiplier" à l'aide de code dérivé de Ce fil et ce fil .

    // un pre-multiply
    uint8_t *imageBytes = (uint8_t *)imageData ;
    int byteCount = width*height*4 ;
    for (int i=0; i < byteCount; i+= 4) {
        uint8_t a = imageBytes[i+3] ;
        if (a!=255 && a!=0 ){
            float alphaFactor = 255.0/a ;
            imageBytes[i] *= alphaFactor ; 
            imageBytes[i+1] *= alphaFactor ; 
            imageBytes[i+2] *= alphaFactor ; 
        }
    }

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