首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glTexImage2D崩溃程序

glTexImage2D崩溃程序
EN

Stack Overflow用户
提问于 2019-11-19 02:05:52
回答 3查看 2.1K关注 0票数 2

这是我的代码:

代码语言:javascript
复制
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时,我的窗口将不再打开。wh都是由stbi_load计算的,stbi_loadstb_image.h库的一部分。我的错误在哪里?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-19 05:58:32

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):

代码语言:javascript
复制
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, img);

注意,glPixelStorei设置了一个全局状态,该状态一直保持到再次更改。

票数 4
EN

Stack Overflow用户

发布于 2019-11-19 04:13:41

我想,这里问题的根源是stbi_load方法加载的像素映射中的通道数与作为第7‘参数传递给glTexImage2D方法的原始图像格式的通道数之间的不匹配。基本上,glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT, WIDTH, HEIGHT, 0, SOURCE_FORMAT, SOURCE_TYPE, SOURCE_PIXMAP_DATA)使OpenGL创建一个具有INTERNAL_FORMAT内部像素表示的2D纹理,该纹理具有WIDTH像素宽,以及来自源像素映射SOURCE_PIXMAP_DATAHEIGH像素高,后者由以SOURCE_FORMATSOURCE_TYPE编码的一系列像素组成。

我认为stbi_load从文件中读取一个3通道,每像素24字节(GL_RGBGL_BYTE)图像,但您告诉OpenGL将源像素映射处理为4通道,32字节/像素(GL_RGBAGL_BYTE)图像。这是错误的。

您应该在指定源像素映射格式之前检查c变量,或者通过将4分配给它的第4‘参数来请求stbi_load加载4色通道图像(该死,这里有很多4)。

票数 1
EN

Stack Overflow用户

发布于 2019-11-19 02:13:36

问题很明显是在GL_RGBA身上。我把它改成了GL_RGB,程序不再崩溃;不过,我很奇怪为什么它一开始就崩溃了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58925604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档