Domanda

Ho una trama caricata in memoria che è di formato RGBA con vari valori alfa.

L'immagine è caricata come segue:

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

Voglio sapere come posso disegnare questa struttura in modo che il canale alfa nell'immagine sia trattato come tutti e la texture è disegnata come un'immagine RGB.

Considera l'immagine di base:

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

Questa immagine è una progressione da 0 a 255 alfa e ha il valore RGB di 255,0,0 in tutto

Tuttavia se lo disegna con la miscelazione disabilitato ho un aspetto che sembra: www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

Quando quello che voglio veramente è un'immagine che assomiglia ad questo: www.ldeo.columbia.edu/~jcoplan/alpha/Correct.png

Apprezzerei davvero alcuni suggerimenti per averlo completamente ignorare il canale alfa. Nota che non riesco a caricare l'immagine in un ruolo RGB inizialmente perché ho bisogno del canale alfa in altri punti.

Modifica: ho provato a usare GL_COMBINE per risolvere il mio problema come tale:

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];
.

Ma ancora senza fortuna, disegna ancora nero a rosso.

È stato utile?

Soluzione

.

Ho una trama caricata in memoria che è di formato RGBA con vari valori alfa

GlDisable (GL_BLEND)

.

Comunque se lo disegna con miscelazione disabilitato ho un'immagine che sembra: www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

Questo succede perché nella tua immagine di origine Tutti i pixel trasparenti sono neri.È un problema con la tua texture / immagine, o forse con la funzione del caricatore, ma non è un problema OpenGL.

Probabilmente potresti provare a risolverlo usando GLTexenv (GL_COMBINE ...) (cioè il colore della trama del mix con il colore sottostante in base al canale alfa), ma dal momento che non ho fatto qualcosa del genere, non sono completamente sicuro,e non posso darti operandi esatti.Era possibile in Direct3D9 (usando D3DTOP_ModulatoAlpha_AddColor), quindi molto probabilmente c'è un modo per farlo in OpenGL.

Altri suggerimenti

Non si dovrebbe disabilitare la fusione, ma utilizzare il GLBLENDFUNC con correttoParametri:

glBlendFunc(GL_ONE, GL_ZERO);
.

O puoi dirlo a OpenGL di caricare solo i canali RGB dell'immagine usando

glPixelStorei(GL_UNPACK_ALIGNMENT, 4)
.

Prima di chiamare glTexImage2D con il formato impostato su GL_RGB.Lo farà saltare il quarto byte di ogni pixel, cioè il canale alfa.

Ho avuto un problema simile e ho scoperto che è stato perché il caricamento dell'immagine iOS stava facendo precipitamente sui valori RBG (come discusso in alcune altre risposte e commenti qui).Mi piacerebbe sapere se c'è un modo per disabilitare la pre-moltiplicazione, ma nel frattempo sono "un-pre-moltiplicando" usando il codice derivato da Questo thread e Questo thread .

    // 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 ; 
        }
    }
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top