当前位置: 首页 > 知识库问答 >
问题:

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

陆子默
2023-03-14

我正在尝试加载.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个答案

赏成益
2023-03-14

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

但是当您通过glTexImage2D指定二维纹理图像时,指定的格式是GL_RGBA,这意味着4个通道,每个像素4个字节。
这会导致数据缓冲区被越界读取。将格式参数更改为GL_RGB,以解决这个问题。

还要注意的是,默认情况下,OpenGL假设图像的每一行的开头都是4字节对齐的。这是因为< code>GL_UNPACK_ALIGNMENT参数默认为4。因为图像有3个颜色通道,并且被紧密地压缩,所以一行的开始可能没有对齐。< br >在指定二维纹理图像(< code>glTexImage2D)之前,将< code>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);

或者通过< code > glGenerateMipmap(GL _ TEXTURE _ 2D)生成小中见大贴图来解决问题。

例如:

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);
 类似资料:
  • 首先,我想说我是stackoverflow的新手,也是Android的新手,所以如果我犯了什么错误,请给我一些最好的建议,帮助我成为最好的程序员。 所以我的问题是在标题中定义的,但我可以在这里解释更多。 我正在使用ImageLoader,并且正在从URL https://s3.ap-south-1.amazonaws.com/aolmislogs/buyer/payment_proof/1.jpg

  • 问题内容: 我知道互联网上有成千上万个示例,但是对于脚本,我已经必须在检索数据时显示加载的gif图像。我的Java知识很差,因此我想问如何更改以下内容: 我的div在这里: 谢谢。约翰 问题答案: 假设您在页面上某处有一个标签,其中包含您的加载消息: 您可以在ajax调用中添加两行:

  • 问题内容: 我想给旋转的gif图像供用户使用jquery进行ajax调用时知道发生了什么。我必须使用async:false,因为否则代码会造成混乱,并且最终会导致会话变量变坏。这是我所拥有的(直到呼叫冻结屏幕后才显示gif。) 在这种情况下,我只希望foo = bar时异步。谁能让我知道为什么在调用之后加载spinner.gif。我认为这可能是因为微调器不在其他任何地方,并且加载时有所延迟,但是当

  • 问题内容: 我想使用jQuery在页面上异步加载外部图像, 并且尝试了以下方法: 但是它总是返回错误,是否有可能像这样加载图像? 我尝试使用method,但是它有效,但是我不知道如果图像不可用,如何设置超时时间(404)。我怎样才能做到这一点? 问题答案: 无需ajax。您可以创建一个新的图像元素,设置其source属性,并在完成加载后将其放置在文档中的某个位置:

  • 问题内容: 问题描述: 我正在创建一个滚动的带有缩略图的文章列表,该列表由我的SQLite数据库填充。通常,它运行缓慢,但速度较慢: 图像加载非常缓慢…我想使用“ 通用图像加载器 ”将图像缓存在设备上,如果您已经查看过图像(或者至少接近该图像,那会使它们看起来只是滚动到视图中) )。但是- 当您向上/向下拖动时,没有任何图像,然后在3-5秒后,图像开始弹出(就像重新下载它们一样) 我正在动态更改缩

  • 我有一个从路径创建纹理的类,但当我尝试加载具有3个通道(rgb)的纹理时,它会在运行这一行时出现读取访问冲突异常 我试图改变stbi加载函数中的参数,但是没有用。 当我加载图像时,它设置了正确的宽度、高度和通道数据,所以我不知道我做错了什么 指向数据的指针也不是nullptr