SDL Surface 转 OpenGL 纹理

3
我该如何使用SDL将.png图像转换为OpenGL表面?目前我有以下内容:
typedef GLuint texture;

texture load_texture(std::string fname){
    SDL_Surface *tex_surf = IMG_Load(fname.c_str());
    if(!tex_surf){
            return 0;
    }
    texture ret;
    glGenTextures(1, &ret);
    glBindTexture(GL_TEXTURE_2D, ret);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB,          GL_UNSIGNED_BYTE, tex_surf->pixels);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    SDL_FreeSurface(tex_surf);
    return ret;
}

以下是关于绘制物体的代码:

启用GL_TEXTURE_2D; 绑定GL_TEXTURE_2D纹理;

        //Use blurry texture mapping (replace GL_LINEAR with GL_NEAREST for blocky)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        glColor4f( 1.0, 1.0, 1.0, 1.0 ); //Don't use special coloring

        glBegin(GL_QUADS);

        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(0.0f, 0.0f, 0.0f);
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(128.0f, 0.0f, 0.0f);
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(128.0f, 128.0f, 0.0f);
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(0.0f, 128.0f, 0.0f);

        glEnd();

        glDisable(GL_TEXTURE_2D);

问题在于它只能处理 .bmp 文件,并且它们会变成蓝色,那么出了什么问题呢? 同时,当我尝试加载 .png 文件时,它显示出来的样子非常奇怪。
1个回答

2

错误的颜色可能是由于通道顺序错误引起的。我手头上用于加载 .bmp 的代码使用了 GL_BGR 而不是 GL_RGB,因此我认为这将解决您在 bmp 上的问题。

你的 png 图像问题更可能是由于每像素32位的png引起的。对于您来说,最好的解决方案可能是检查SDL表面的格式字段,以确定传递给glTexImage2D的适当标志/值。


好的,BGR可以工作,但我不知道如何做第二件事。我从互联网上得到了上面的代码... - dirkwillem
1
@dirkwillem 你的PNG图片可能包含alpha通道信息。尝试使用GL_RGBA - jrok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接