glGetTexImage使用纹理格式GL_ALPHA读取太多数据

时间:2014-09-25 19:32:27

标签: c++ arrays opengl crash textures

我试图通过glGetTexImage检索仅alpha纹理的像素信息。

问题是,glGetTexImage-Call似乎读取的数据超出应有的数量,导致内存损坏和delete [] - Call崩溃。这是我的代码:

int format;
glGetTexLevelParameteriv(target,0,GL_TEXTURE_INTERNAL_FORMAT,&format);
int w;
int h;
glGetTexLevelParameteriv(target,0,GL_TEXTURE_WIDTH,&w);
glGetTexLevelParameteriv(target,0,GL_TEXTURE_HEIGHT,&h);
if(w == 0 || h == 0)
    return false;
if(format != GL_ALPHA)
    return false;
unsigned int size = w *h *sizeof(unsigned char);
unsigned char *pixels = new unsigned char[size];
glGetTexImage(target,level,format,GL_UNSIGNED_BYTE,&pixels[0]);
delete[] pixels;

glGetError报告没有错误,没有glGetTexImage-Call它不会崩溃。

'目标'是GL_TEXTURE_2D(纹理有效并在显示的代码之前绑定),' w'是19岁,' h'是24岁,'等级'是0。

如果我将数组大小增加到(w * h * 100),它也不会崩溃。我知道GL_UNSIGNED_BYTE与我系统上的unsigned char的大小相同,所以我不明白这里发生了什么。

来自哪里的附加数据以及如何确保我的阵列足够大?

1 个答案:

答案 0 :(得分:7)

默认情况下,由glGetTexImage等OpenGL像素操作写入或读取的每一行都与4字节边界对齐,这可能会增加一些填充。

要修改对齐方式,请使用glPixelStorei设置GL_[UN]PACK_ALIGNMENTGL_PACK_ALIGNMENT会影响从OpenGL内存中读取的操作(glReadPixelsglGetTexImage等),而GL_UNPACK_ALIGNMENT会影响写入OpenGL内存的操作(glTexImage等。 )

对齐可以是1(紧密填充,无填充),24(默认值)或8

因此,在您的情况下,请在运行glPixelStorei(GL_PACK_ALIGNMENT, 1);之前运行glGetImage2D