为什么在SDL和OpenGL中使用IMG_Load加载到纹理的图像看起来偏蓝?

时间:2012-12-02 03:41:36

标签: c++ opengl sdl photoshop sdl-image

我正在加载PNG纹理:

void Sprite::setTexture(string f) {
    SDL_Surface *image = IMG_Load(f.c_str());
    if (image == NULL) {
        this->texture = -1;
        return;
    }
    SDL_DisplayFormatAlpha(image);
    unsigned object(0);
    glGenTextures(1, &object);
    glBindTexture(GL_TEXTURE_2D, object);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->w, image->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
    SDL_FreeSurface(image);
    this->texture = object;
}

唯一的问题是,不是这样(在Photoshop中看到):

Original box

它显示如下(在应用程序中看到):

怎么了?我尝试过用GL_RGBA玩一下,并尝试将其反转为GL_BGRA或将其更改为GL_RGBA8,GL_RGBA16 ......但没有任何改变(实际上GL_BGRA没有显示任何内容)。我需要alpha通道,即使在这个小PNG中,边框的半径为4px,因此图像角度是透明的。

我做错了什么? App box

1 个答案:

答案 0 :(得分:2)

看起来你的频道看起来很倒。从这里很难看出你的alpha是否正常工作,但有些纹理是ARGB,也许你应该尝试一下!

实际上,只是为了验证您的数据,您应该检查

SDL_Surface *image

看看image->format->Rmask Gmask BmaskAmask是什么,通过这种方式,您可以确定曲面的格式。