glGetTexImage使用纹理格式GL_ALPHA读取过多数据
glGetTexImage reads too much data with texture format GL_ALPHA
我正试图通过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的大小与我的系统上的无符号字符的大小相同,所以我不明白这里发生了什么。
额外的数据来自哪里?我如何确保我的阵列足够大?
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);
。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 从Qt中的每个像素读取Alpha通道