SDL 表面到OpenGL纹理

sdl surface to opengl texture

本文关键字:纹理 OpenGL 表面 SDL      更新时间:2023-10-16

如何使用 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;
}

和我的代码来绘制东西:

glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, tex);

        //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时,它看起来非常奇怪。

错误的通道顺序可能导致颜色错误。我用于加载.bmp的代码使用GL_BGR而不是GL_RGB,所以我认为这将解决您的 bmp 问题。

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