这是我的代码:
int h, w, c;
unsigned char* img = stbi_load("bricks.jpg", &w, &h, &c, 0);
if (img == NULL) {
printf("Error in loading the image\n");
}
printf("Image loaded with width of %d, height of %d, and %d channels", w, h, c);
GLuint txtr = 0;
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &txtr);
glBindTexture(GL_TEXTURE_2D, txtr);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, img);
由于某种原因,取消注释后,我的窗口不再打开glTexImage2D
。w
和h
都由进行计算stbi_load
,这是stb_image.h
库的一部分。我的错在哪里?
jpg图像由3个颜色通道(GL_RGB
)组成,并stbi_load
返回紧密包装的图像。图片缓冲区(img
)的字节数为w * h * 3
。
默认情况下,OpenGL假定图像每行的开头对齐4个字节。这是因为GL_UNPACK_ALIGNMENT
默认情况下该参数为4。由于图像具有3个颜色通道,并且包装紧密,所以行的开头可能未对齐。
因此,图像缓冲区的大小假定为aligne(w*3, 4) * h
。
之所以引起崩溃,是因为glTexImage2D
。越界访问缓冲区。
GL_UNPACK_ALIGNMENT
在指定二维纹理图像(glTexImage2D
)之前,将参数更改为1 :
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, img);
注意,glPixelStorei
设置一个全局状态,该状态一直保留到再次更改为止。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句