我不能让我的图像的透明度工作

时间:2009-07-28 01:40:29

标签: c++ user-interface opengl sdl

源于我的这个问题:I'm seeing artifacts when I attempt to rotate an image

在那里的源代码中,我正在加载一个TIF因为我不能在我的生活中获得任何其他图像格式来正确加载透明度部分。我试过PNG,GIF和& TGA。我希望能够加载PNG。我希望上面问题中给出的源代码足够,如果没有,请告诉我。

为了更好地描述当我尝试加载其他格式时会发生什么 - 我尝试的其中一个图像是128 * 128橙色三角形。根据格式,它可以使整个128 * 128方形橙色,或使图像的透明部分变白。

3 个答案:

答案 0 :(得分:2)

确保已启用Alpha混合

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

否则图元会在应该有透明度的地方画出纯色。 您可能需要不同的blendfunc。这是一种常见的设置。

答案 1 :(得分:1)

我不熟悉SDL,但由于加载图像是SDL,我会仔细查看他们的文档。我在自己的工作中使用.png和OpenGL,透明度没有问题。 (我使用名为LightZPng的.png解析器。)

另外,我刚注意到您的关联帖子有:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

而不是:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

这会影响添加 对于背景中的任何内容透明的像素(假设这些纹素中的alpha为0)。

答案 2 :(得分:1)

好的,我是OpenGL + SDL的新手,但这就是我所拥有的......加载所有内容?格式SDL_image支持,除了我无法使.xcf工作,没有.lbm来测试。

//called earlier..
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

//load texture
SDL_Surface* tex = IMG_Load(file.c_str());
if (tex == 0) {
    std::cout << "Could not load " << file << std::endl;
    return false;
}

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

//nearest works but linear is best when scaled?
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

width = tex->w;
height = tex->h;

//IMG_is* doesn't seem to work right, esp for TGA, so use extension instead..
std::string ext = file.substr(file.length() - 4);
bool isBMP = (ext.compare(".bmp") == 0) || (ext.compare(".BMP") == 0);
bool isPNG = (ext.compare(".png") == 0) || (ext.compare(".PNG") == 0);
bool isTGA = (ext.compare(".tga") == 0) || (ext.compare(".TGA") == 0);
bool isTIF = ((ext.compare(".tif") == 0) || (ext.compare(".TIF") == 0) ||
              (ext.compare("tiff") == 0) || (ext.compare("TIFF") == 0));

//default is RGBA but bmp and tga use BGR/A
GLenum format = GL_RGBA;
if(isBMP || isTGA)
    format = (tex->format->BytesPerPixel == 4 ? GL_BGRA : GL_BGR);

//every image except png and bmp need to be converted
if (!(isPNG || isBMP || isTGA || isTIF)) {
    SDL_Surface* fixedSurface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
    SDL_BlitSurface(tex, 0, fixedSurface, 0);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_UNSIGNED_BYTE, fixedSurface->pixels);
    SDL_FreeSurface(fixedSurface);
} else {
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_UNSIGNED_BYTE, tex->pixels);
}

SDL_FreeSurface(tex);

list = glGenLists(1);
glNewList(list, GL_COMPILE);
    GLint vertices[] = {
            0,0, 0,0,
            0,1, 0,height,
            1,1, width,height,
            1,0, width,0
        };

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glBindTexture(GL_TEXTURE_2D, texture);
    glTexCoordPointer(2, GL_INT, 4*sizeof(GLint), &vertices[0]);
    glVertexPointer(2, GL_INT, 4*sizeof(GLint), &vertices[2]);
    glDrawArrays(GL_POLYGON, 0, 4);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glEndList();

然后绘制我将颜色设置为不透明白色(不影响透明度?)然后只需调用列表..

glColor4f(1,1,1,1);
glCallList(list);

当然,对我的代码的任何帮助也会非常感激! :)