C++ 我能';我的图像中的透明度无法正常工作

C++ 我能';我的图像中的透明度无法正常工作,c++,user-interface,opengl,sdl,C++,User Interface,Opengl,Sdl,基于我的这个问题: 在那里的源代码中,我正在加载一个TIF,因为我一生都无法获得任何其他图像格式来正确加载透明度部分。我试过PNG、GIF和TGA。我希望能够加载PNG。我希望上面问题中给出的源代码足够了,如果不够,请告诉我 为了更好地描述当我尝试加载其他格式时会发生什么,我尝试的图像之一是128*128橙色三角形。根据格式的不同,它可以使整个128*128正方形变成橙色,也可以使图像的透明部分变成白色 我对SDL不太熟悉,但因为是SDL加载图像,所以我会仔细查看他们的文档。我在自己的工作中与O

基于我的这个问题:

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


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

我对SDL不太熟悉,但因为是SDL加载图像,所以我会仔细查看他们的文档。我在自己的工作中与OpenGL一起使用.png,透明度工作没有问题。(我使用一个名为.png的解析器。)

另外,我刚刚注意到您的链接帖子:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
而不是:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

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

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

另外,我刚刚注意到您的链接帖子:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
而不是:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

这会影响添加对背景中的任何对象都应该透明的像素(假设这些纹理中的alpha为0)。

确保已启用alpha混合

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
否则,基本体将在应有透明度的位置绘制纯色。
您可能需要一个不同的blendfunc。这是一种常见的设置

确保已使用启用alpha混合

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
否则,基本体将在应有透明度的位置绘制纯色。
您可能需要一个不同的blendfunc。这是一种常见的设置

好的,我是OpenGL+SDL的新手,但这里是我的。。全部加载?SDL_图像支持的格式,除非我无法使用.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();

当然,对我的代码的任何帮助都将不胜感激!:)

好的,我是OpenGL+SDL的新手,但这里是我的。。全部加载?SDL_图像支持的格式,除非我无法使用.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();

当然,对我的代码的任何帮助都将不胜感激!:)

我在第一篇文章中链接了我上一个问题中的代码。实际上,你有:glBlendFunc(GL_ONE,GL_ONE_减去SRC_ALPHA);//请注意GL_ONE而不是GL_SRC_ALPHA-这可能会根据您看到的内容而有所不同。抱歉,如果您已经有了代码,我无法在iPhone上滚动代码块。正如Jim所说,你的blendfunc可能不正确。您使用的blendfunc用于将纹理与预先乘以的alpha混合。啊,我当时尝试了您的代码,但现在根本无法绘制:(尝试加载具有已知透明度的图像,然后查看调试器中加载的缓冲区,以确保alpha值包含您期望的透明度。如果您根本看不到任何内容,我怀疑alpha可能为0。我在第一篇文章中链接了我上一个问题中的代码。实际上,您有:glBlendFunc(GL_1,GL_1减去SRC_α)//请注意GL_ONE而不是GL_SRC_ALPHA-这可能会根据您看到的内容而有所不同。如果您已经有了代码,我无法在iPhone上滚动代码块。正如Jim所说,您使用的blendfunc可能不正确。您使用的blendfunc用于将纹理与预乘ALPHA混合。啊,好的我试过你的代码,但现在根本画不出来:(尝试加载具有已知透明度的图像,然后在调试器中查看加载的缓冲区,以确保alpha值包含您期望的透明度。如果您根本看不到任何内容,我怀疑alpha可能为0。更改该值会使图像根本不显示。即使使用TIF nowHuh,也可能是alp吗对于所有纹理,ha仅为0?在将图像数据传递给GLTEXAGE2D之前,我会查看图像数据,以确认某些纹理的alpha值。如果它们只是RGB图像(完全没有alpha),则确保执行glColor4ub(255、255、255、255)在渲染之前,请确保您的alpha有效地设置为完全不透明。更改此设置会使图像根本不显示。即使使用TIF nowHuh,是否所有纹理的alpha都只是0?我会查看您的图像数据,然后将其传递给GLTEXAGE2D,以确认某些纹理的alpha值。如果它们只是RGB图像(完全没有alpha),然后确保在渲染之前执行glColor4ub(255、255、255、255),以确保您的alpha有效地设置为完全不透明。我使用了代码中的位和块,最终成功了。结果是在加载图像时(我使用了自己的函数而不是IMG_Load())它在转换BPP时丢弃了alpha层。所以非常感谢你的代码。我使用了你代码中的比特和片段,最终成功了。结果证明,当我加载图像时(我使用了我自己的函数而不是IMG_Load()),它在转换BPP时丢弃了alpha层。所以非常感谢你的代码。