Подтвердить что ты не робот

GlPixelStorei (GL_UNPACK_ALIGNMENT, 1) Недостатки?

Каковы недостатки всегда использования alginment 1?

glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glPixelStorei(GL_PACK_ALIGNMENT, 1)

Будет ли это влиять на производительность на современном gpus?

4b9b3361

Ответ 1

Как данные не могут быть выровнены по 1 байту?

Это сильно говорит о недостаточном понимании того, что означает выравнивание строк в операциях переноса пикселей.

Ожидается, что данные изображений, которые вы передадите OpenGL, будут сгруппированы в строки. Каждая строка содержит width количество пикселей, причем каждый пиксель имеет размер, определенный параметрами формата и типа. Таким образом, формат GL_RGB с типом GL_UNSIGNED_BYTE приведет к пикселю размером 24 бита. В противном случае ожидается, что пикселы будут упакованы, поэтому строка из 16 пикселей будет занимать 48 байтов.

Каждая строка должна быть выровнена по определенному значению, как определено GL_PACK/UNPACK_ALIGNMENT. Это означает, что значение, которое вы добавляете к указателю, чтобы перейти к следующей строке: align(pixel_size * width, GL_*_ALIGNMENT). Если размер пикселя составляет 3 байта, ширина равна 2, а выравнивание равно 1, размер байта строки равен 6. Если выравнивание равно 4, размер байта строки восемь.

См. проблему?

Данные изображения, которые могут поступать из некоторого формата файла изображения, загруженного некоторым загрузчиком изображений, имеют выравнивание строк. Иногда это выравнивается по 1 байт, а иногда и нет. Изображения DDS имеют выравнивание, указанное как часть формата. Во многих случаях изображения имеют 4-байтовые выравнивания строк; поэтому размеры пикселей менее 32 бит будут иметь отступы в конце строк с определенной шириной. Если выравнивание, которое вы даете OpenGL, не соответствует этому, вы получаете искаженную текстуру.

Вы устанавливаете выравнивание в соответствии с выравниванием формата изображения. Если вы знаете или иным образом можете убедиться, что выравнивание строк всегда 1 (и это маловероятно, если вы не написали свой собственный формат изображения или создатель DDS), вам необходимо установить выравнивание строк именно так, как ваш формат изображения.

Ответ 2

Будет ли это влиять на производительность на современном gpus?

Нет, поскольку настройки хранилища пикселей имеют смысл только для передачи данных с или на GPU, а именно для выравнивания ваших данных. Когда-то в памяти графического процессора он выравнивается каким бы то ни было образом, что делает GPU и драйвер.

Ответ 3

Там не будет никакого влияния на производительность. Установка более высокого выравнивания ничего не улучшает и не ускоряет.

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

Выравнивание по умолчанию равно 4, что может вызвать проблемы в случаях, когда вы загружаете текстуры R, RG или RGB, которые не являются 4-байтовыми числами с плавающей запятой, или ширина не делится на 4.

Я не знаю, сколько сегодня изображений не плотно упаковано. Я еще не сталкивался с ними. Но, возможно, у вас может быть изображение, скажем, 3x3 RGB ubyte, строка которого выглядит следующим образом:

R - G - B - R - G - B - R - G - B - X - X - X (всего 16 байтов)

И тогда установив выравнивание на 4, было бы хорошо перепрыгнуть через последний отступ. Вы должны сделать что-то, чтобы решить проблему, но вы могли бы также использовать ROW_LENGTH, чтобы перепрыгнуть через нее, так как этот параметр используется при работе с подмножествами изображения, и в этом случае вам иногда приходится перепрыгивать намного больше, чем 3 или 7 байт (это максимум, который может дать параметр выравнивания). Так что я действительно не уверен, зачем вам нужен параметр выравнивания.