Sil*_*lan 2 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;
Run Code Online (Sandbox Code Playgroud)
glGetError报告没有错误,没有glGetTexImage-Call它不会崩溃.
'target'是GL_TEXTURE_2D(纹理有效并在显示的代码之前绑定),'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.
所以在你的情况下,在运行glPixelStorei(GL_PACK_ALIGNMENT, 1);之前运行glGetImage2D.