使用STBI_Image OpenGL加载图像时在0x69ABF340引发异常

时间:2019-10-05 15:04:50

标签: c++ opengl textures

我正在尝试加载.jpg图像作为背景,我使用stbi_load加载了该图像,但是当我尝试绘制纹理时,出现以下错误: 在0x69ABF340(nvoglv32.dll)引发异常 0xC0000005:访问冲突读取位置0x0C933000。发生

我尝试在加载图像时更改频道,也许图像不是在rgb中,而是在rgba中,但没有成功。

int width = 1280;
    int height = 720;
    int channels = 3;
    GLuint t;
    stbi_set_flip_vertically_on_load(true);
    unsigned char *image = stbi_load("bg.jpg",
        &width,
        &height,
        &channels,
        STBI_rgb);
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &t);

    glBindTexture(GL_TEXTURE_2D, t);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);

    glBindTexture(GL_TEXTURE_2D, 0);

该窗口应包含指定的纹理,相反,我得到一个带有异常的白色窗口。

1 个答案:

答案 0 :(得分:0)

参数STBI_rgb表示要加载具有3个颜色通道的生成纹理。这导致图像缓冲区(image)每像素3个字节。

但是,当您通过glTexImage2D指定二维纹理图像时,指定的格式为GL_RGBA,建议使用4个通道,因此每个像素4个字节。
这导致超出范围读取数据缓冲区。将格式参数更改为GL_RGB,以解决该问题。

进一步请注意,默认情况下OpenGL假定图像每行的开头对齐4个字节。这是因为GL_UNPACK_ALIGNMENT参数默认为4。由于图像具有3个颜色通道,并且包装紧密,因此行的开头可能未对齐。
在指定二维纹理图像(glTexImage2D)之前,将GL_UNPACK_ALIGNMENT参数更改为1。

此外,纹理还不完整(mipmap)。 GL_TEXTURE_MIN_FILTER的初始值为GL_NEAREST_MIPMAP_LINEAR。如果不进行更改并且不创建mipmap,则纹理不是“完整”的,也不会是“显示的”。参见glTexParameter
将缩小过滤器设置为GL_NEARESTGL_LINEAR

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

或通过glGenerateMipmap(GL_TEXTURE_2D)生成mipmap来解决该问题。

例如:

glBindTexture(GL_TEXTURE_2D, t);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);