2009-08-18 15 views
4

Lorsque je rends à la texture, puis dessinez la même image, il semble rendre tout plus sombre. Pour obtenir cette image:Rendu à un problème de texture avec alpha

http://img24.imageshack.us/img24/8061/87993367.png

Je rend le carré supérieur gauche avec la couleur (1, 1, 1, .8) à une texture, puis rendu cette texture, plus le carré du milieu (même couleur) à une autre texture, puis enfin que texture plus le carré en bas à droite (même couleur) à l'écran. Comme vous pouvez le voir, chaque fois que je rends à la texture, tout devient un peu plus sombre.

Mon rendre à la texture code ressemble à: (J'utilise OpenGL ES sur l'iPhone)

// gen framebuffer 
GLuint framebuffer; 
glGenFramebuffersOES(1, &framebuffer); 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); 

// gen texture 
GLuint texture; 
glGenTextures(1, &texture); 

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glDisable(GL_TEXTURE_2D); 

// hook it up 
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture, 0); 
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)) 
    return false; 

// set up drawing 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); 
glViewport(0, 0, Screen::Width, Screen::Height); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, Screen::Width, 0, Screen::Height, -1, 1); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glColor4f(1, 1, 1, 1); 

// do whatever drawing we'll do here 
Draw(); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); 

Est-il quelque chose que je fais mal ici? Avez-vous besoin de plus de code pour le comprendre? Que pourrait-il se passer ici?

Répondre

6

Je ne devine:

Dessin la première texture vous donne 204 (0,8 * 255) dans les canaux RVB et alpha. Lorsque vous dessinez pour la deuxième fois (avec GL_BLEND activé, je présume), vous obtenez le gris clair 204 RGB avec 80% alpha qui vous donne un gris moyen. Solution: utilisez glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) et prémultipliez vos couleurs.

+0

Merci! Je continuais à utiliser inconsciemment 'glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)' sans penser à ses ramifications –