当宽度不是4个倍数时,GlRead像素会导致堆叠粉碎

glReadPixels leads to stack smashing when the width is not a multiple of 4

本文关键字:像素 GlRead 4个      更新时间:2023-10-16

我正在尝试使用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作为对齐。