В моей программе 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
Надеюсь, что это должно предотвратить повреждение или неисправность приложения?
Право, глупый меня. Я забыл об источнике пикселей - я использую функцию IMG_Load (...) из библиотеки SDL_image. Похоже, что, по крайней мере, когда дело доходит до битмапов с 3 байтами на пиксель, он преобразует его в 32BPP. Однако я не могу быть уверен, что это будет работать в любом случае (что означает: любые загруженные форматы), правильно? Итак, я открыл свое руководство, но информации о нем нет. Я думаю, что я должен начать поиск в библиотеках, которые являются частями SDL_image, таких как libpng, libtiff и т. Д. И если я узнаю, я все еще не могу быть уверен, как их использует SDL_image. – somnock
И посмотрите обновленный пост. Это решение? – somnock
@somnock: Нет. Вам действительно нужно будет прочитать документацию для любого загрузчика изображений и выяснить, что такое * фактическое выравнивание строк. Просто потому, что пиксели не имеют размера 4 байта, это не означает, что он не использует 4-байтовое выравнивание строк. –