I’ve banged my head for a couple days, now I need to ask for help.
I’m doing 2D work with simple layers and bitmaps - load up some bitmaps, go into ortho mode, and draw some quads and lines, at various values of z. All is well. I can draw bitmaps on top of bitmaps, lines across bitmaps, all very pretty and proper.
Now I’m trying to graduate to bitmaps with alpha channels. I’ve verified that the images really do have pixels with alpha=0. I’m sorting my objects so that I draw far (high z) objects before near objects, which for me also happens to mean opaque objects get drawn before transparent ones.
What I get is that things draw correctly, colors are right, etc., except for transparent areas of bitmaps, which look uniformly greyish and show no hint of the underlying image.
Here are the relevant fragments of code (this is Windows):
init contains:
pfd.dwFlags = PFD_SUPPORT_OPENGL |PFD_DRAW_TO_WINDOW| PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 24;
pfd.iLayerType = PFD_MAIN_PLANE;
format = ChoosePixelFormat( hDC, &pfd );
SetPixelFormat, etc.
Loading up the bitmaps as textures:
glGenTextures( 1, &textureId_);
// select our current texture
glBindTexture( GL_TEXTURE_2D, textureId_ );
//tell OpenGL we packed bytes tight
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0,
GL_RGBA,
br.width_, br.height_, //bitmap dimensions
0,
GL_BGRA_EXT,
GL_UNSIGNED_BYTE,
p);
Preparing to draw looks like
glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
RECT r;
GetClientRect(Windex::hWnd_, &r);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, r.right, 0, r.bottom, -1, 1);
glViewport(0, 0, r.right, r.bottom);
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
drawing each bitmap looks like:
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_DECAL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3d(r.left, r.bottom, r.z);
glTexCoord2f(1,0);
glVertex3d(r.right, r.bottom, r.z);
glTexCoord2f(1,1);
glVertex3d(r.right, r.top, r.z);
glTexCoord2f(0,1);
glVertex3d(r.left, r.top, r.z);
glEnd();
glDisable(GL_TEXTURE_2D);
After drawing stuff:
glFlush();
SwapBuffers(hdc_);
Please, which step did I screw up or miss?