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图片。