我正在尝试通过 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 它也不会崩溃。
'target' 为 GL_TEXTURE_2D(纹理有效且绑定(bind)在显示代码之前),'w' 为 19,'h' 为 24,'level' 为 0。
如果我将数组大小增加到 (w *h *100),它也不会崩溃。我知道 GL_UNSIGNED_BYTE 的大小与我系统上的 unsigned char 相同,所以我不明白这里发生了什么。
额外的数据来自哪里?我如何确保我的数组足够大?
最佳答案
OpenGL 像素操作(如 glGetTexImage
)写入或读取的每一行默认与 4 字节边界对齐,这可能会添加一些填充。
要修改对齐方式,请使用 glPixelStorei
和 GL_[UN]PACK_ALIGNMENT
设置。 GL_PACK_ALIGNMENT
影响从 OpenGL 内存读取的操作(glReadPixels
、glGetTexImage
等),而 GL_UNPACK_ALIGNMENT
影响写入操作到 OpenGL 内存(glTexImage
等)
对齐方式可以是1
(紧密压缩,无填充)、2
、4
(默认)或8
.
因此,在您的情况下,在运行 glGetImage2D
之前运行 glPixelStorei(GL_PACK_ALIGNMENT, 1);
。
关于c++ - glGetTexImage 读取过多纹理格式为 GL_ALPHA 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046619/