Выравнивание 1 байта против выравнивания 4 байта (упаковка пикселей)

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

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

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

2 ответа

Решение

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

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

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

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

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

(x + y * width) * 3

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

y * 600

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

y * 600 + x * 3

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

Другие вопросы по тегам