我试图glReadPixels通过以下代码提取图像数据:
   std::array<unsigned char, 3 * height * width> data;
   glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, data.data());
当宽度是4的倍数(高度似乎是任意的)时,图像是完美的.但是,当它不是时,我得到运行时错误:
*** stack smashing detected ***: <unknown> terminated       
因此,例如,以下(宽度,高度)对可以正常工作:
(20,20),(20,21),(20,22),(20,23),(20,24)
(24,20),(24,21),(24,22),(24,23),(24,24)
以下产生"堆栈粉碎"错误:
(21,20),(22,20),(23,20)
我猜想有一些填充,但我在OpenGL网站上没有看到任何提及:
https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glReadPixels.xml
有人可以请一些文件说明我应该分配多少空间,以及填充是什么样的?
默认情况下,读取操作的对齐方式GL_PACK_ALIGNMENT设置为4个字节.这意味着,每行必须从具有此对齐的地址开始.由于您每个像素读取3个字节,因此您需要的内存比预期的多(3 * width) % 4 != 0.
您可以分配所需的内存量,也可以通过调用强制执行不同的对齐
glPixelStore(GL_PACK_ALIGNMENT, desired_alignment);
正如@dave所指出的那样,只允许1,2,4或8作为对齐.
| 归档时间: | 
 | 
| 查看次数: | 49 次 | 
| 最近记录: |