我正在尝试通过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在我的系统上与unsigned char具有相同的大小,所以我不明白发生了什么。
额外的数据来自哪里,如何确保我的数组足够大?
glGetTexImage
这样的像素操作写入的每行数据都会按照4字节边界对齐,这可能会添加一些填充。请查阅GL_[UN]PACK_ALIGNMENT
。 - Colonel Thirty Two