如何使用SDL, OpenGL和c++加载带有透明度的.png图像



我正在尝试加载并显示具有透明度的。png图像。整个图片不是透明的,这只是我在Photoshop中裁剪的一个包的图片,周围是透明的。我需要将它加载到我的程序中,在c++上使用SDL和OpenGL,但是当我尝试它时,而不是正确显示,图像中袋子周围的空间是"模糊的"(我只能这样说)。我想说的是,透明度不起作用。

这是我到目前为止的代码:

init()方法:

SDL_Surface *surface;
GLenum texture_format;
GLint  nOfColors;
if ( (surface = IMG_Load("bag.png")) ) { 
    // Check that the image's width is a power of 2
    if ( (surface->w & (surface->w - 1)) != 0 ) {
        printf("warning: bag.png's width is not a power of 2n");
    }
    // Also check if the height is a power of 2
    if ( (surface->h & (surface->h - 1)) != 0 ) {
        printf("warning: bag.png's height is not a power of 2n");
    }
        // get the number of channels in the SDL surface
        nOfColors = surface->format->BytesPerPixel;
        if (nOfColors == 4)     // contains an alpha channel
        {
                if (surface->format->Rmask == 0x000000ff)
                        texture_format = GL_RGBA;
                //else
                        //texture_format = GL_BGRA;
        } else if (nOfColors == 3)     // no alpha channel
        {
                if (surface->format->Rmask == 0x000000ff)
                        texture_format = GL_RGB;
                //else
                        //texture_format = GL_BGR;
        } else {
                printf("warning: the image is not truecolor..  this will probably breakn");
                // this error should not go unhandled
        }
    // Have OpenGL generate a texture object handle for us
    glGenTextures( 1, &texture );
    // Bind the texture object
    glBindTexture( GL_TEXTURE_2D, texture );
    // Set the texture's stretching properties
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    // Edit the texture object's image data using the information SDL_Surface gives us
    glTexImage2D( GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0,
                      texture_format, GL_UNSIGNED_BYTE, surface->pixels );
} 
else {
    printf("SDL could not load bag.png: %sn", SDL_GetError());
    SDL_Quit();
    //return 1;
}    
// Free the SDL_Surface only if it was successfully created
if ( surface ) { 
    SDL_FreeSurface( surface );
}
drawScene()方法:

float xMin, xMax, yMin, yMax;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -6.0f);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Use nice (linear) scaling 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Use nice (linear) scaling
glBegin (GL_QUADS);
glNormal3f(0.0f, 0.0f, 1.0f);
if (texturesOn) glTexCoord2f(0.0f, 1.0f);
glVertex3f(4.3f, -3.5f, 0.0f); //bottom left
if (texturesOn) glTexCoord2f(1.0f, 1.0f);
glVertex3f(5.3f, -3.5f, 0.0f); //bottom right
if (texturesOn) glTexCoord2f(1.0f, 0.0f);
glVertex3f(5.3f, -4.5f, 0.0f); //top right
if (texturesOn) glTexCoord2f(0.0f, 0.0f);
glVertex3f(4.3f, -4.5f, 0.0f); //top left
glEnd();
glDisable(GL_TEXTURE_2D);
glutSwapBuffers();

你需要启用透明度的混合工作:

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

另外,您应该检查加载的PNG文件是否包含alpha通道。

最新更新