glTexImage2D与宽度/高度相关的Segfault

时间:2011-09-11 19:45:19

标签: image opengl textures

当我尝试加载771x768图像时,我遇到了段错误。

尝试使用24x24和768x768图像并且它们有效,没问题。

这是预期的吗?为什么它不会因GL错误而优雅地失败?

分段错误发生在glTexImage2D调用中。我正在加载PPM二进制文件,因此每像素打包24位。这个奇数与奇数维相结合可能产生一个非4字节(甚至2字节)的对齐结构(并且在我足够分配的缓冲区之外引用可能是错误的原因但是gdb没有向我显示内存地址(我可以用来查明是否是导致它的原因)。)。

glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, dataptr);
// in this specific case of failure, width = 771, height = 768,
// dataptr contains 1776384 bytes of binary RGB image data (771*768*3 = 1776384)

2 个答案:

答案 0 :(得分:16)

  

这个奇数与奇数维相结合可能产生一个非4字节(甚至2字节)的对齐结构(并且在我足够分配的缓冲区之外引用可能是错误的原因

这可能是原因。幸运的是,您可以设置对齐OpenGL使用读取像素数据。在致电glTexImage…(…)之前做

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);

答案 1 :(得分:1)

我在opengl论坛上看过这个:

width must be 2^m + 2(border) for some integer m.
height must be 2^n + 2(border) for some integer n. 

(source)

我发现了这一点,我相信它澄清了正在发生的事情:

1. What should this extension be called?

  STATUS: RESOLVED

  RESOLUTION:  ARB_texture_non_power_of_two.  Conventional OpenGL
  textures are restricted to size dimensions that are powers of two.

来自GL_ARB_texture_non_power_of_two