glTexImage2D: 读取位置XXX时发生访问冲突

在跟着Learn OpenGL教程学习纹理部分时,大家或许会加载一张自己喜欢的图片作为纹理,但加载某些图片时会报以下错误:

读取位置XXX时发生访问冲突

这个错误通常出现在以下位置:

unsigned char* data = stbi_load("demo.jpg", &image_width, &image_height, &image_channel, 0);
if (data) {
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image_width, image_height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}

IDE会在glGenerateMipmap(GL_TEXTURE_2D)处报错,但这个错误一般是由glTexImage2D引起的。首先检查下是不是通道数搞错了:比如说加载的是jpg图片但在glTexImage2D中使用的是GL_RGBA.

 

如果没有搞错,那么报错的原因很有可能是这个:

加载的图片为jpg, 但它的宽度不是4的倍数!!!

关于上述错误的描述可参考此处,与GPU的数据对齐有关。

比较简单的解决方法有:把图片的宽度或高度缩放为4的倍数;或者把jpg图片转为png格式的图片, 加载png图片作为纹理(因为png图片具有R,G,B,A这4个通道,无论png图片的大小如何,图片的总数据量image_width * image_height * 4一定是4的倍数). 

 

如果使用Image Magick将jpg转为png, 直接执行以下命令:

magick convert demo.jpg demo.png

得到的png图片还是3个通道,因为png图片也有24位深度的(参见此处)。使用如下命令:

magick convert demo.jpg png32:demo.png

就能得到4通道的png图片。

posted @ 2023-07-18 13:47  overxus  阅读(410)  评论(0编辑  收藏  举报