2010-06-23 9 views
3

Après le chargement d'une image, j'ai les octets individuels pour chaque canal chargé dans un tableau de caractères non signés. Il est passé à une fonction qui le projette comme une texture sur un quad. Tout semble fonctionner correctement, sauf le canal alpha, qui apparaît comme la couleur de fond. J'utilise OpenGL pour dessiner l'image. Aurais-je avantage à ajouter un mécanisme de stratification? Aussi, comment puis-je obtenir l'effet transparent que je veux?Dessiner le canal alpha correctement dans OpenGl

Note: Ceci est le code que j'ai besoin de sentiment a changé:

void SetUpView() 
{ 
    // Set color and depth clear value 
    glClearDepth(1.f); 
    glClearColor(1.f, 0.f, 0.f, 0.f); 

    // Enable Z-buffer read and write 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 
    glDepthMask(GL_TRUE); 

    glEnable (GL_BLEND); 
    glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

    // Setup a perspective projection 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(90.f, 1.f, 1.f, 500.f); 
}; 

De plus, voici le code pour rendre le quad.

void DrawTexturedRect(RectBounds *Verts, Image *Texture) 
{ 
    glBindTexture(GL_TEXTURE_2D, GetTextureID(Texture)); 

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glPixelZoom(1, -1); 

    glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 1.0); 
    glVertex3f(Verts->corners[0].x, Verts->corners[0].y, Verts->corners[0].z); 

    glTexCoord2f(1.0, 1.0); 
    glVertex3f(Verts->corners[1].x, Verts->corners[1].y, Verts->corners[1].z); 

    glTexCoord2f(1.0, 0.0); 
    glVertex3f(Verts->corners[2].x, Verts->corners[2].y, Verts->corners[2].z); 

    glTexCoord2f(0.0, 0.0); 
    glVertex3f(Verts->corners[3].x, Verts->corners[3].y, Verts->corners[3].z); 
    glEnd(); 
}; 

La classe Image contient un tableau de caractères non signés, obtenu à l'aide d'OpenIL.

code correspondant:

loaded = ilLoadImage(filename.c_str()); 
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); 

unsigned char *bytes = ilGetData(); 

//NewImage is an instance of an Image. This is returned and passed to the above function. 
NewImage->data = bytes; 

Problem http://img375.imageshack.us/img375/9585/j120192.png

Merci

+1

Données insuffisantes. Vous n'avez pas affiché la routine de chargement de texture et vous n'avez pas montré la routine de rendu réelle. – SigTerm

+0

Okay, j'ai essayé d'éclaircir ce qui se passe dans la boucle de rendu. – Jeff

+0

Aussi, comment installez-vous OpenGL? Êtes-vous sûr de vouloir utiliser le canal alpha (par exemple, le format de pixel si vous utilisez le glut, GLUT_RGBA si vous utilisez le glut)? – sbk

Répondre

0

glClearColor (1.f, 0.F, 0.F, 0.F);

Je suppose que c'est à la valeur par défaut RGBA, et vous définissez rouge à 1.0.

Que diriez-vous d'une meilleure explication de ce que vous essayez d'accomplir?

+1

Voir la boîte rouge autour du curseur? Dans Paint.Net, il n'y a rien là. C'est supposé être le canal alpha. – Jeff

0

Essayez:

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

Edit: Je sais à quoi ça ressemble. Il semble que vous dessinez le carré bleu (qui a une position d'ordre Z en le plaçant derrière le curseur) APRÈS le curseur. Vous devez dessiner les choses dans la bonne Z-Order en face-à-face lors de l'alpha-blending ou vous voyez des erreurs comme vous voyez.

+0

Merci, mais j'ai toujours le même effet. Est-ce que cela devrait être appelé une fois ou chaque image? – Jeff

2

Avant de tirer quoi que ce soit transparent, vous devez appeler:

glDepthMask(false); 

Et puis après:

glDepthMask(true); 

En outre, tous les objets transparents doivent être établis après toutes les opaques.

+0

J'ai eu le même problème et cela a résolu pour moi. – Balk

Questions connexes