使用 glTexImage2D 时“框架不在模块中”

jau*_*unt 4 c++ opengl glew sdl-image sdl-2

我以前从未遇到过这个错误,并且我glTexImage2D在项目的其他地方使用也没有错误。下面是 Visual Studio 显示的错误的屏幕截图以及反汇编视图: 框架不在模块中 反汇编代码

鉴于该行ptr中包含我认为存在指针错误,但我不知道我做错了什么。SDL_surface下面是我用来从纹理转换为纹理的函数。

void surfaceToTexture(SDL_Surface *&surface, GLuint &texture) {
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, surface->pixels);
    glDisable(GL_TEXTURE_2D);
}
Run Code Online (Sandbox Code Playgroud)

该函数在程序的其他地方成功,例如加载文本时:

SDL_Surface *surface; 
surface = TTF_RenderText_Blended(tempFont, message.c_str(), color);
if (surface == NULL)
    printf("Unable to generate text surface using font: %s! SDL_ttf Error: %s\n", font.c_str(), TTF_GetError());
else {
    SDL_LockSurface(surface);
    width = surface->w;
    height = surface->h;
    if (style != TTF_STYLE_NORMAL)
        TTF_SetFontStyle(tempFont, TTF_STYLE_NORMAL);
    surfaceToTexture(surface, texture);
    SDL_UnlockSurface(surface);
}
SDL_FreeSurface(surface);
Run Code Online (Sandbox Code Playgroud)

但加载图像时则不然:

SDL_Surface* surface = IMG_Load(path.c_str());
if (surface == NULL)
    printf("Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError());
else{
    SDL_LockSurface(surface);
    width = (w==0)?surface->w:w;
    height = (h==0)?surface->h/4:h;
    surfaceToTexture(surface, texture);
    SDL_UnlockSurface(surface);
}
SDL_FreeSurface(surface);
Run Code Online (Sandbox Code Playgroud)

这两个示例都是从定义的类中提取的texture。图片路径正确。我知道这就是glTexImage2D导致问题的原因,因为我在函数的开头添加了一个断点surfaceToTexture并单步执行该函数。即使它不起作用,texture并且surface确实具有看似正确的值/属性。

有任何想法吗?

dat*_*olf 6

您收到的错误意味着进程在一段代码中崩溃,调试器无法找到任何调试信息(程序集和源代码之间的关联)。对于属于程序调试构建一部分的任何内容来说通常都是这种情况。

现在,在您的情况下,您所调用的glTexImage2D参数“谎言”于您使用该参数指向的缓冲区的内存布局data。指针不携带任何有意义的元信息(就汇编级别而言,它们只是另一个具有特殊含义的整数)。因此,您必须确保传递给函数的所有参数以及指针都匹配。如果不是,在该函数的深处的某个地方,或者它调用的任何东西(或调用的东西等),内存可能会以违反操作系统设置的约束的方式被访问,从而触发这种崩溃。

问题的解决方案: 修复您的代码,即确保传递给 OpenGL 的内容是一致的。它在 OpenGL 驱动程序中崩溃,但这只是因为你对它撒了谎。

  • @jaunt:您正在使用格式参数“GL_RGBA”调用“glTexImage2D”,即每个像素 4 个通道。如果加载的字体表面匹配,它将起作用;另一个重要部分是使用“glPixelStorei”设置的像素存储解包参数,它们实际上是进入“glTexImage”的另一组参数。您确实必须确保进入该函数的所有内容都匹配。如果没有,它可能会崩溃。默认参数可能会偶然与传递的参数匹配。仅仅因为它在某些时候起作用并不意味着它起作用是因为一切都做得正确。 (2认同)
  • @jaunt:与“glTexImage”的格式不匹配不会生成错误。`glTexImage` 只会解释 `data` 缓冲区中的位,就好像它们采用指定的格式一样,无论这在语义上是否有意义。只要缓冲区本身与指定的图像格式和布局参数兼容(本质上归结为“更大”),您就可以将任何内容放入其中。对于它的价值,你可以向它传递一个可执行的二进制文件。举个例子:这是我的体积光栅化器的测试程序,渲染它自己的可执行文件:。http://imgur.com/a/4qKdn (2认同)