2013-05-18 5 views
3

Я читаю OpenGL SuperBible для OpenGL 3.x. Мне трудно понять всю концепцию упаковки пикселей. Я получаю, что обычно для изображения шириной 199 пикселей требуется 597 байт [(199 * 3) 3 для каждого цветового канала RGB]. Мой первый вопрос заключается в том, почему это только иногда бывает правильным, автор говорит, что это только woks с системой выравнивания 4 байта. Далее он добавляет, что добавится еще три байта, чтобы сделать его легко делимым на четыре, что я тоже не понимаю. Так что действительно мой вопрос в том, каково значение 4-байтового выравнивания - что это значит? Затем автор говорит, что альтернатива - это 1-байтовое выравнивание, которое я тоже не понимаю.1 Байт Выравнивание против 4 Байт-выравнивания (пиксельная упаковка)

Автор говорит, что .TGA 1 байт выровнен или «плотный», а .bmp выровнен по 4 байт.

Что такое выравнивание по 4 байт, выравнивание по 1 байт и почему я должен использовать один над другим? Когда следует использовать .tga или .bmp для текстурирования?

ответ

2

Ну, это касается выравнивания данных. Он отличается от разных архитектур и управления памятью. Например, когда вы кодируете 32-битный процессор, заполнение по умолчанию в структуре/int составляет 4 байта. В 64-разрядной версии 8-байтовый. Если вы хотите переопределить заполнение по умолчанию в структуре кода, вы можете использовать #pragma pack (на визуальной студии), атрибут ((упакованный)) (gcc).

Посмотрите здесь для получения дополнительной справки:

+0

Это имеет смысл, спасибо! – foobar5512

2

Хуже того, ваше описание не отличает выравнивание пикселей от выравнивания линии сканирования.

199-пиксельное изображение с 24-битным цветом действительно требует 597 байт. Но вторая строка сканирования будет начинаться со смещения 600, так как она должна быть выровнена с границей 4 байта, а 600 является первой 4-байтовой границей, которая не перекрывает первую строку сканирования.

Это означает, что вместо того чтобы начинать каждый пиксель в байте

(x + y * width) * 3 

Каждая строка будет начинаться с байта

y * 600 

и каждый пиксель в байте

y * 600 + x * 3 

Но почему не только сделайте ваши текстуры мощностью 2, которые поддерживаются на всех картах во всех версиях OpenGL и не вызывают вопросы выравнивания? Вы используете текстурные координаты, чтобы убедиться, что отступы никогда не обрабатываются и не отображаются.

+0

Что вы имеете в виду, пропиткой? Я понятия не имею о каких-либо разделах памяти, это мой первый низкоуровневый API. – foobar5512

+2

Если у вас есть изображение шириной 199 пикселей и поместите его в 256-кратную текстуру (которая является ближайшей силой-2), у вас будет 57 дополнительные пиксели рядом с вашим изображением. Я назвал это дополнение, художник назвал бы его матированием. Самое приятное в текстурах «сила-2» состоит в том, что дробные числа, которые представляют пиксели на вашем изображении, будут иметь знаменатель мощности 2, что делает их точно представляемыми в двоичном формате с плавающей запятой (и фиксированной точкой). –

+0

А-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а! Но почему бы просто не использовать что-то, что соответствует одному байту, поэтому мне не нужно разбираться с проблемой заполнения?Благодаря! – foobar5512