Передача данных пикселей: для изображений 24BPP и GL_UNPACK_ALIGNMENT установлено значение 4

В моей программе OpenGL я загружаю изображение 24BPP с шириной 501, GL_UNPACK_ALINGMENT параметр установлен в 4, Они пишут это не должно работать потому что размер каждой из строк, которые загружаются (501*3 = 1503) нельзя разделить на 4. Однако при отображении я могу видеть обычную текстуру без артефактов.

Так что мой код работает. Я обдумываю, почему нужно полностью это понять и не допустить прослушивания всего проекта.

Может быть (?) Это работает, потому что я не просто звоню glTexImage2D, Вместо этого сначала я создаю правильную (с размерами, равной двум) чистую текстуру, затем загружаю пиксели с glTexSubImage2D,

РЕДАКТИРОВАТЬ:

Но как вы думаете, есть ли смысл писать такой код?

// w - the width of the image
// depth - the depth of the image

bool change_alignment = false;

if (depth != 4 && !is_divisible(w*depth)) // *
{
change_alignment = true;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}

// ... now use glTexImage2D

if (change_alingment) glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // set to default

// * - of course we don't even need such a function
// but I wanted to make the code as clear as possible

Надеюсь, это должно предотвратить сбой или сбой приложения?

0

Решение

Это зависит от того, откуда поступают данные вашего изображения.

Формат Windows BMP, например, Применяет 4-байтовое выравнивание строк. Действительно, форматы как это точно Зачем OpenGL имеет поле для выравнивания строк: потому что некоторые форматы изображений обеспечивают выравнивание строк.

Поэтому правильность использования 4-байтового выравнивания строк в ваших данных полностью зависит от того, как ваши данные выровнены в памяти. Некоторые загрузчики изображений автоматически выравниваются до 4 байтов. А некоторые не будут.

2

Другие решения

Других решений пока нет …