5
\$\begingroup\$

I am making a game using OpenGL, with SDL_Image employed to load the textures. When drawn on screen, there's no alpha -- in an exact square around the opaque contents of the texture, black is drawn; outside that space, white is drawn. Here is my OpenGL init code...

SDL_SetVideoMode(windowWidth, windowHeight, 16, SDL_HWSURFACE|SDL_GL_DOUBLEBUFFER|SDL_OPENGL);
glClearColor(0, 0, 0, 0);
glClearDepth(1.0f);
glViewport(0, 0, windowWidth, windowHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, windowWidth, windowHeight, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glLoadIdentity();

...here is my image loading function...

SDL_Surface *loadImage (const char *filename, bool alpha = true) {
    SDL_Surface* loadedImage = NULL;
    SDL_Surface* zoomedImage = NULL;
    SDL_Surface* optimizedImage = NULL;

    loadedImage = IMG_Load(filename);

    if (loadedImage != NULL) {
        zoomedImage = zoomSurface(loadedImage,windowScaleH/4,windowScaleH/4,SMOOTHING_ON);
        SDL_FreeSurface(loadedImage);

        if (alpha) optimizedImage = SDL_DisplayFormatAlpha(zoomedImage);
        else optimizedImage = SDL_DisplayFormat(zoomedImage);
        SDL_FreeSurface(zoomedImage);
    }

    return optimizedImage;
}

...here is the code I actually use to create the GL texture...

GLuint thisIsMyTexture;
glGenTextures(1, &thisIsMyTexture);
temporarySurface = loadImage("theimagetomytexture.png");
glBindTexture(GL_TEXTURE_2D,thisIsMyTexture);
glTexImage2D(GL_TEXTURE_2D, 0, 4, temporarySurface->w, temporarySurface->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, temporarySurface->pixels);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

...and the drawing code itself.

glBindTexture(GL_TEXTURE_2D,thisIsMyTexture);
glBegin( GL_QUADS );
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 1.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(32.0f, 0.0f, 1.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex3f(32.0f, 32.0f, 1.0f);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 32.0f, 1.0f);
glEnd();

That's all the relevant information I can think of. Help would be appreciated! :D

\$\endgroup\$

1 Answer 1

5
\$\begingroup\$

You set the blend func, but you didn't enable blending. You'll need to call

glEnable(GL_BLEND);

to turn it on, then use glDisable to turn it off when you want to go back to regular opaque drawing.

\$\endgroup\$
1
  • \$\begingroup\$ Wow, I can't believe I forgot that. This is what coding half-asleep in the middle of the night does to you. Thanks!! \$\endgroup\$ Oct 24, 2011 at 18:49

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .