SDL_surface到OpenGL纹理

时间:2009-05-04 18:11:05

标签: c++ opengl sdl textures

嘿,我有这个脚本加载SDL_Surface并将其保存为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;
}

问题在于它无法正常工作。当我从main函数调用该函数时,它只是不加载任何图像(当显示它只是转动绘图颜色时),并且当从主函数外部的任何函数调用时,程序崩溃。 正是这条线使程序崩溃:

2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);

有人可以看到这个错误吗?

5 个答案:

答案 0 :(得分:2)

我敢打赌,在尝试将其转换为OpenGL纹理之前,您需要转换SDL_Surface。这里应该给你一般的想法:

SDL_Surface* originalSurface; // Load like an other SDL_Surface

int w = pow(2, ceil( log(originalSurface->w)/log(2) ) ); // Round up to the nearest power of two

SDL_Surface* newSurface = 
  SDL_CreateRGBSurface(0, w, w, 24, 0xff000000, 0x00ff0000, 0x0000ff00, 0);
SDL_BlitSurface(originalSurface, 0, newSurface, 0); // Blit onto a purely RGB Surface

texture ret;

glGenTextures( 1, &ret );
glBindTexture( GL_TEXTURE_2D, ret );
glTexImage2D( GL_TEXTURE_2D, 0, 3, w, w, 0, GL_RGB,
          GL_UNSIGNED_BYTE, newSurface->pixels );

I found the original code here。可能还有一些other useful posts on GameDev

答案 1 :(得分:0)

我不确定你是否在代码片段之外的某个地方这样做,但是你打电话给

glEnable(GL_TEXTURE_2D);

在某个时候?

答案 2 :(得分:0)

此外,默认的GL_REPLACE纹理混合模式会将当前的glColor与输入的纹素RGB值相乘。结果:glColor3f(0,0,0)会给你黑色纹理应该是:)

在绘制纹理几何体之前,请确保glColor3f(1,1,1)。

答案 3 :(得分:0)

问题可能出在对internalformat的调用的第三个参数(glTexImage2D)上。

glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);

您必须使用诸如GL_RGBGL_RGBA之类的常量,因为宏的实际值与颜色分量的数量无关。

参考手册https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml中提供了允许值的列表。

这似乎是一个经常犯的错误。也许某些驱动程序很聪明并且可以更正此错误,所以对于某些人来说错误的路线可能仍然有用。

/usr/include/GL/gl.h:473:#define GL_RGB             0x1907
/usr/include/GL/gl.h:474:#define GL_RGBA            0x1908

答案 4 :(得分:0)

一些较旧的硬件(令人惊讶的是,在我今年购买的新机器上运行的 emscripten 的 opengl ES 2.0 仿真)似乎不支持尺寸不是 2 的幂的纹理。结果证明这是我被困了一段时间的问题(我得到了一个黑色矩形而不是我想要的精灵)。因此,在将图像大小调整为 2 的幂后,海报的问题可能会消失。

见:https://www.khronos.org/opengl/wiki/NPOT_Texture