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)
由于某种原因,当我取消评论时,我的窗口不再打开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
在指定二维纹理图像 ( ) 之前,将参数更改为 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
设置一个全局状态,该状态将一直保留到再次更改为止。
归档时间: |
|
查看次数: |
3007 次 |
最近记录: |