1

嘿,我有这个脚本来加载 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;
}

问题是它不起作用。当我从主函数调用该函数时,它只是不加载任何图像(当显示它只是改变绘图颜色时),当从主函数之外的任何函数调用时,程序崩溃。正是这一行使程序崩溃:

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

有人能看出这有什么错误吗?

4

4 回答 4

2

我敢打赌,您需要先将 SDL_Surface 转换为 OpenGL 纹理。这里有一些东西应该给你一个大致的想法:

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 );

我在这里找到了原始代码。GameDev 上可能还有一些其他有用的帖子

于 2009-05-04T18:33:32.920 回答
1

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

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

您必须使用像GL_RGBor这样的常量,GL_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
于 2019-09-20T19:27:08.593 回答
0

我不确定您是否在代码片段之外的某个地方执行此操作,但是您是否致电

glEnable(GL_TEXTURE_2D);

在某一点?

于 2009-05-05T03:57:36.467 回答
0

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

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

于 2021-02-22T20:48:54.947 回答