2013-02-24 2 views
1

Большинство библиотек изображений дают изображение как ширину, высоту, высоту, так и пиксели массива. OpenGL, однако не принимает шаг напрямую, вместо этого он ожидает:Учитывая высоту изображения, как рассчитать GL_UNPACK_ALIGNMENT?

glPixelStorei(GL_UNPACK_ALIGNMENT, align); 
glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length); 

row_length является pitch/bytes_per_pixel, но как вычислить правильное значение для align?

+0

"Большая библиотека изображений"? Я не знаю очень многих. FreeImage, но это все. –

+1

SDL, ClanLib, Gtk, Cairo, libjpeg, libpng и т. Д. Я не думаю, что когда-либо касался того, который не использовал формат width/height/pitch/array/format вне OpenGL. Некоторые называют это 'stride' или' rowbytes' вместо 'pitch', но это все. – Grumbel

ответ

-1

GL_UNPACK_ALIGNMENT - это смещение байт, где первый пиксель в строке начинается с изображения. Установка его на один - это почти всегда безопасная ставка (т. Е. Она работает почти с каждым типом изображения [и она никогда не работает для меня]).

Значение по умолчанию - четыре, что отлично подходит для изображений RGBA, но с ошибками для изображений RGB (вы сразу узнаете, когда увидите изображение - это будет выглядеть как набор диагональных полос).

+0

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

+0

Это эффективное количество байтов в одном компоненте пикселей. Например, если у вас есть 'unsigned short' компоненты для прямоугольника пикселя' GL_RGB', вы должны установить 'GL_UNPACK_ALIGNMENT' равным 2 (' sizeof (GLushort) '). – radical7

+0

-1: Нет, установка его на 1 не является «почти всегда» правильной. Если в формате изображения используется выравнивание строк в 4 байта (и некоторые из них), и вы пытаетесь сохранить изображение RGB с нечетной шириной, то вы испортите свое дополнение. Кроме того, это не «байт-смещение, где первый пиксель в строке начинается с изображения»; это байт * выравнивание * для каждой строки пикселей. То есть, строка будет дополнена этим выравниванием. –

0

Для подавляющего большинства изображений, которые вы увидите, вам не нужно GL_ROW_LENGTH. Установка этого значения в ненулевое значение может сильно ухудшить производительность загрузки; только используйте его, когда вы абсолютно необходимо это.

Для большинства изображений шаг будет просто (width * bpp), выровненный с некоторой границей. Например, если bpp составляет 3 (байт на пиксель), а ширина равна 9, вы получаете 27. Это не очень хороший номер строки для многих компьютеров, поэтому они часто выравнивают его до ближайшего кратного 4. Таким образом, высота, которую вы увидите в большинстве изображений, равна 28.

Итак, чтобы вычислить выравнивание, просто вычислите наибольшую мощность двух (до 8), которые делятся на высоту. Если высота изображения равна 28, наибольшая мощность равна 4. Установите значение GL_UNPACK_ALIGNMENT. Как правило, вы можете остановиться на 4, потому что это самое большое выравнивание, которое будут использовать большинство изображений.

Времена, когда вы потребность использовать GL_ROW_LENGTH являются, когда вычисленная шаг (align(width * bpp, alignment)) не равна фактической шаг. Если это произойдет, вам нужно использовать выравнивание и длину строки. Но это такое редкое явление, что вы, вероятно, должны просто отказаться от любого изображения, которое использует такой невероятно неправильный шаг.

Смежные вопросы