2013-08-29 5 views
0

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

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

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

EDIT:

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

// 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 

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

ответ

2

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

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

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

+0

Право, глупый меня. Я забыл об источнике пикселей - я использую функцию IMG_Load (...) из библиотеки SDL_image. Похоже, что, по крайней мере, когда дело доходит до битмапов с 3 байтами на пиксель, он преобразует его в 32BPP. Однако я не могу быть уверен, что это будет работать в любом случае (что означает: любые загруженные форматы), правильно? Итак, я открыл свое руководство, но информации о нем нет. Я думаю, что я должен начать поиск в библиотеках, которые являются частями SDL_image, таких как libpng, libtiff и т. Д. И если я узнаю, я все еще не могу быть уверен, как их использует SDL_image. – somnock

+0

И посмотрите обновленный пост. Это решение? – somnock

+0

@somnock: Нет. Вам действительно нужно будет прочитать документацию для любого загрузчика изображений и выяснить, что такое * фактическое выравнивание строк. Просто потому, что пиксели не имеют размера 4 байта, это не означает, что он не использует 4-байтовое выравнивание строк. –