glReadPixels приводит к разрушению стека, когда ширина не кратна 4 - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь использовать 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

Может ли кто-нибудь указать мне какую-то документацию, объясняющую, сколько места я должен выделить, и как выглядит отступ?

1 Ответ

0 голосов
/ 18 февраля 2019

По умолчанию выравнивание для операций чтения GL_PACK_ALIGNMENT установлено в 4 байта.Это означает, что каждая строка должна начинаться с адреса с этим выравниванием.Поскольку вы читаете 3 байта на пиксель, вам нужно больше памяти, чем ожидалось, если (3 * width) % 4 != 0.

Вы можете выделить необходимый объем памяти или принудительно установить другое выравнивание, вызвав

glPixelStore(GL_PACK_ALIGNMENT, desired_alignment);

Как отметил @dave, в качестве юстировки допускается только 1, 2, 4 или 8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...