"框架不在模块中#34;使用glTexImage2D时

时间:2017-04-02 13:56:05

标签: c++ opengl sdl-2 glew sdl-image

之前我从未遇到过这个错误,我在项目的其他地方使用glTexImage2D而没有错误。下面是Visual Studio显示的错误以及反汇编视图的屏幕截图: Frame not in module Disassembly code

鉴于行中有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);
}

此功能在程序的其他位置成功,例如加载文本时:

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

但不是在加载图片时:

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

这两个示例都是从定义了texture的类中提取的。 图像的路径是正确的。 我知道glTexImage2D会导致问题,因为我在surfaceToTexture的开头添加了断点并逐步完成了该功能。 即使它不起作用,texturesurface也会看似正确的值/属性。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

你得到的错误意味着,procress在一段代码中崩溃,调试器无法找到任何调试信息(程序集和源代码之间的关联)。这通常适用于/程序调试版本的任何部分。

现在你遇到的情况是,你用glTexImage2D调用了data的参数,这些参数与你用resolve or reject参数指向它的缓冲区的内存布局有关。指针不带有任何有意义的元信息(就汇编级别而言,它们只是另一个整数,具有特殊含义)。因此,您必须确保传递给函数的所有参数以及指针都匹配。如果不是,在该函数的大部分深处,或者它调用的任何内容(或者调用等),可能会以违反操作系统设置的约束的方式访问内存,从而触发此类崩溃。

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