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

glGetTexImage reads too much data with texture format GL_ALPHA

本文关键字:ALPHA 读取 多数据 GL 纹理 格式 glGetTexImage      更新时间:2023-10-16

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

问题是,glGetTexImage调用读取的数据似乎比它应该读取的数据多,导致内存损坏和delete[]-调用时崩溃。这是我的代码:

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调用,它不会崩溃。

"target"是GL_TEXTURE_2D(纹理有效且绑定在所示代码之前),"w"是19,"h"是24,"level"是0。

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

额外的数据来自哪里?我如何确保我的阵列足够大?

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

要修改对齐,请将glPixelStoreiGL_[UN]PACK_ALIGNMENT设置一起使用。GL_PACK_ALIGNMENT会影响从OpenGL内存读取的操作(glReadPixelsglGetTexImage等),而GL_UNPACK_ALIGNMENT会影响写入OpenGL内存(glTexImage等)的操作

对齐可以是1(紧密填充,没有填充)、24(默认值)或8中的任何一个。

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