【问题标题】:Exception thrown at 0x69ABF340 when loading image with STBI_Image OpenGL使用 STBI_Image OpenGL 加载图像时在 0x69ABF340 引发异常
【发布时间】:2019-10-05 15:04:50
【问题描述】:

我正在尝试加载 .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);

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

【问题讨论】:

    标签: c++ opengl textures


    【解决方案1】:

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

    【讨论】:

    • 谢谢,修复了异常。但是,我现在得到一个黑色窗口。
    • @WillRobert 我已经扩展了答案,可能glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) 不见了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多