当宽度不是4的倍数时,glReadPixels会导致堆栈粉碎

bre*_*att 2 c++ opengl

我试图glReadPixels通过以下代码提取图像数据:

   std::array<unsigned char, 3 * height * width> data;
   glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, data.data());
Run Code Online (Sandbox Code Playgroud)

当宽度是4的倍数(高度似乎是任意的)时,图像是完美的.但是,当它不是时,我得到运行时错误:

*** stack smashing detected ***: <unknown> terminated       
Run Code Online (Sandbox Code Playgroud)

因此,例如,以下(宽度,高度)对可以正常工作:

(20,20),(20,21),(20,22),(20,23),(20,24)
(24,20),(24,21),(24,22),(24,23),(24,24)
Run Code Online (Sandbox Code Playgroud)

以下产生"堆栈粉碎"错误:

(21,20),(22,20),(23,20)
Run Code Online (Sandbox Code Playgroud)

我猜想有一些填充,但我在OpenGL网站上没有看到任何提及:

https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glReadPixels.xml

有人可以请一些文件说明我应该分配多少空间,以及填充是什么样的?

BDL*_*BDL 6

默认情况下,读取操作的对齐方式GL_PACK_ALIGNMENT设置为4个字节.这意味着,每行必须从具有此对齐的地址开始.由于您每个像素读取3个字节,因此您需要的内存比预期的多(3 * width) % 4 != 0.

您可以分配所需的内存量,也可以通过调用强制执行不同的对齐

glPixelStore(GL_PACK_ALIGNMENT, desired_alignment);
Run Code Online (Sandbox Code Playgroud)

正如@dave所指出的那样,只允许1,2,4或8作为对齐.