В моей программе 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
Надеюсь, это должно предотвратить сбой или сбой приложения?
Это зависит от того, откуда поступают данные вашего изображения.
Формат Windows BMP, например, Применяет 4-байтовое выравнивание строк. Действительно, форматы как это точно Зачем OpenGL имеет поле для выравнивания строк: потому что некоторые форматы изображений обеспечивают выравнивание строк.
Поэтому правильность использования 4-байтового выравнивания строк в ваших данных полностью зависит от того, как ваши данные выровнены в памяти. Некоторые загрузчики изображений автоматически выравниваются до 4 байтов. А некоторые не будут.
Других решений пока нет …