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

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

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

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

 ronag15 июн. 2012 г., 07:38
@NicolBolas: Как данные не могут быть выровнены по 1 байту?
 ronag15 июн. 2012 г., 07:37
@DietrichEpp: Что такое POTS-текстуры?
 Nicol Bolas15 июн. 2012 г., 00:29
Вы имеете в виду, помимо того факта, что некоторые из ваших данных могут не иметь выровненных по 1 байту строк?
 Dietrich Epp15 июн. 2012 г., 01:58
Для текстур без POTS это может повлиять на скорость загрузки / выгрузки. Для текстур POTS это не должно иметь никакого эффекта.
 ronag15 июн. 2012 г., 08:23
@DietrichEpp: Мое приложение ограничено скоростью загрузки / выгрузки. Я предполагаю, что мне придется тестировать, я просто хочу лучше понять характеристики производительности. Я не знаю Я вполне понимаю, почему это будет намного медленнее, как и в случае с memcpy, оптимизированной для SSE. Я думаю, что он должен быть в состоянии скопировать большую часть при правильном выравнивании, а затем иметь специальный случай для последних байтов.

Ответы на вопрос(2)

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

 ronag15 июн. 2012 г., 07:38
Я спрашиваю, может ли и когда это повлиять на загрузку / выгрузку gpu, и есть ли какие-либо другие аспекты, о которых мне нужно подумать.
 15 июн. 2012 г., 02:45
Я думаю, он спрашивает, будет ли один или несколько графических процессоров требовать от процессоров некоторой модификации данных перед загрузкой. То есть, если графический процессор не может обрабатывать строки с выравниванием по байту.
 15 июн. 2012 г., 10:00
@ronag: Хорошо, если графический процессор не может справиться с форматом данных ваших исходных данных, тогда драйвер должен сначала преобразовать формат данных. Однако, поскольку вы будете периодически загружать данные текстуры, это будет занимать очень мало процессорного времени. Однако передача данных - это не то, что я считаю проблемой производительности графического процессора. Узким местом явно являются процессор и шина данных.
Решение Вопроса

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

Ожидается, что данные изображений, которые вы передаете в 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, размер байта строки равенeight.

Видишь проблему?

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

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

 03 авг. 2013 г., 19:03
Ответ Никола точен, но мне все же некоторое время удавалось запутаться, что данные не будут выровнены по 1 байту. Для тех, кто застрял в этой точке, предположим, что вы получаете данные из библиотеки загрузки изображений, вы не управляли данными и, следовательно, не управляли компоновкой. Учитывая, что данные могут быть импортированы с байтами выравнивания на концах каждой строки. Это выравнивание - то, что вы указываете. Надеюсь, это поможет кому-то!
 15 июн. 2012 г., 09:16
@ronag: здесь так много разных переменных, и вы рассматриваете наиболее сложный вариант, который заключается в переопределении распаковщика OpenGL в вашем приложении в надежде, что он может быть быстрее. Дело в том, что вы догадываетесь, что RGB - & gt; Конверсия BGRA имеет, вероятно, порядка 1% накладных расходов. означает, что вы, вероятно, не готовы к этому - это предположение не проходит тест на запах по нескольким причинам (поговорите, если хотите). Возможно, вы захотите переключиться в чат или открыть другой вопрос об улучшении производительности вашего приложения, предполагая, что вы можете опубликовать данные тестов.
 15 июн. 2012 г., 10:54
@ronag: 1) Вы не собираетесь побеждать распаковщика OpenGL. 2) Даже если вы собираетесь победить, распаковка PBOasynchronous, что потребовало бы явного использования потока из вашего приложения. 3) Правильный способ оптимизировать это - сравнить различные форматы до тех пор, пока вы не найдете тот (и), который изначально поддерживает ваше оборудование (т. Е. Самые быстрые), а затемpreprocess ваши данные таковы, что они соответствуют тем. Значения формата / типа гораздо важнее для этого, чем выравнивание строк.
 15 июн. 2012 г., 08:59
@ronag: Вы вряд ли побьете производительность распаковщика, и это печально известная функция для написания с использованием SIMD. Это звучит как большая работа, которая должна быть обоснована с помощью тестов, показывающих, что ваше приложение ограничено скоростью загрузкиand распаковщик негативно влияет на скорость загрузки.
 25 авг. 2013 г., 01:40
@sepideh: потому что это то, чтоalignment средства. Каждая строка должна начинаться с четного кратного выравнивания. 32 - следующее четное кратное 8, которое больше 27.

Ваш ответ на вопрос