glTexImage2D崩溃程序

iaskdumbstuff

这是我的代码:

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

由于某种原因,取消注释后,我的窗口不再打开glTexImage2Dwh都由进行计算stbi_load,这是stb_image.h的一部分我的错在哪里?

拉比德76

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

glTexImage2d中的border参数

glTexImage2D读取越界

glTexImage2D'目标无效'

glTexImage2D访问冲突

glTexImage2D - 通道计为内部格式

glTexImage2D的GL_INVALID_VALUE

使用pyopengl glTexImage2D时出现OSError

glTexImage2D数据未按预期填充

关于使用gl_luminance的glteximage2d的拼图

GLES2:带有GL_LUMINANCE的glTexImage2D给我黑屏/纹理

glTexImage2D() 参数和生成帧缓冲区

将glTexImage2D保存到文件系统以进行检查

在LWJGL中将glTexImage2D与ByteBuffer一起使用时纹理为空

iPhone 6s / RoboVM(?)GLTexImage2D渲染问题

在glTexImage2D()中指定GL_RGBA32F时奇怪的输出

glTexImage2D切片和对齐问题出现在窗口中

将`GL_UNSIGNED_INT_24_8`与`glTexImage2D`一起使用

Android12 opengles3.0 glTexImage2D 0x502 錯誤

OpenGL ES 3.1-无法使用glTexImage2D创建IMMUTABLE纹理

glTexImage2D时,[OpenGL | C#] vhost32.exe停止工作

我是否将错误的数据传递给 glTexImage2D?

iOS和android之间的glTexImage2D错误细微之处-不一致的文档

通过将RGB浮点像素数据传递到glTexImage2D来加载纹理

带有C ++的OpenGL:将类数组传递给glTexImage2d时vtable遇到麻烦

返回stbi_load函数的结果并将其用于glTexImage2D会导致内存冲突

glTexImage2D不起作用,但是将FragColor设置为vec4(1.0,0,0,1.0)会给我红色图像

当我在glTexImage2D中选择与着色器中采样方式不同的内部格式时,情况会如何?

glTexImage2D:得到err pre :( 0x506内部0x1908格式0x1908类型0x1401

声明大型2D数组如何使程序崩溃?