【问题标题】:sdl surface to opengl texturesdl表面到opengl纹理
【发布时间】:2012-07-01 12:02:05
【问题描述】:

如何使用 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 文件时,它的显示效果很奇怪。

【问题讨论】:

    标签: c++ opengl load sdl textures


    【解决方案1】:

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

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

    【讨论】:

    • 好的,BGR 工作,但我不知道如何做第二件事。我从网上得到了上面的代码...
    • @dirkwillem 你的 PNG 图片可能包含 alpha 通道信息。试试GL_RGBA
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多