gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:57:07 25 4
gpt4 key购买 nike

我正在尝试通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com