glTexImage2D 崩溃程序

ias*_*uff 3 c++ opengl glut visual-studio

这是我的代码:

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);
Run Code Online (Sandbox Code Playgroud)

由于某种原因,当我取消评论时,我的窗口不再打开glTexImage2Dwh都是由 计算的stbi_load,它是库的一部分stb_image.h。我的错误在哪里?

Rab*_*d76 7

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在指定二维纹理图像 ( ) 之前,将参数更改为 1 glTexImage2D

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, img);
Run Code Online (Sandbox Code Playgroud)

注意,glPixelStorei设置一个全局状态,该状态将一直保留到再次更改为止。