c++ - glGetTexImage 读取过多纹理格式为 GL_ALPHA 的数据

标签 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 它也不会崩溃。

'target' 为 GL_TEXTURE_2D(纹理有效且绑定(bind)在显示代码之前),'w' 为 19,'h' 为 24,'level' 为 0。

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

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

最佳答案

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);

关于c++ - glGetTexImage 读取过多纹理格式为 GL_ALPHA 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046619/

相关文章:

c++ - 调用进程退出后是否可以将 DLL 保留在内存中?

c++ - 从 C 到 C++ 的转换避免 <strsafe.h>

java - 如何将 opengl 显示附加到 JFrame 并正确处理它?

c - 辅助线程中的 Opengl 渲染(纹理)

c++ - Tesseract总是在图片中缺少文本行

javascript - 仅随机排列关联数组中的选定项目

C++(在基于数组的堆栈中弹出)我们是否删除该元素?

Java:序列化初学者问题:-(

c++ - 如何使键盘输入的 Action 即时

c++ - 程序输出正确的值,但最后崩溃了