Когда мне следует использовать STD140 в OpenGL?

Когда я могу использовать STD140 для юниформ-блоков в OpenGL?

Хотя я не уверен на 100%, я считаю, что есть альтернатива, которая может достичь того же, называемая «Общий доступ».

Это просто предпочтение для кодера? Или есть причины использовать один над другим?


person Dan Webster    schedule 29.04.2013    source источник
comment
Если вы знаете что такое макет std140, то вы уже должны знать, почему вы хотели бы или не хотели бы использовать его. Итак, вы спрашиваете, что такое макет std140?   -  person Nicol Bolas    schedule 29.04.2013
comment
@NicolBolas Нет, я знаю, что разница в том, что вам нужно использовать запрос, а в другом — дополнять. Мой вопрос остается в силе.   -  person Dan Webster    schedule 29.04.2013
comment
@NicolBolas: я вижу это в коде, который изучаю, и рад найти этот ресурс, который помогает понять его.   -  person Jack    schedule 05.05.2017


Ответы (2)


Объекты универсального буфера описаны в http://www.opengl.org/registry/specs/ARB/uniform_buffer_object.txt

Хранилище данных для юниформ-блока может быть объявлено для использования одного из трех макетов в памяти: packed, shared или std140.

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

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

  3. std140 юниформ-блоки имеют стандартную кросс-платформенную компоновку для разных поставщиков. Неиспользованная униформа не будет уничтожена.

Унифицированная блочная компоновка std140, которая гарантирует определенное поведение при упаковке и не требует от приложения запроса смещений и шагов. В этом случае минимальный размер все еще может быть запрошен, даже если он определен заранее на основе только объявления юниформ-блока. Смещение каждого юниформа в юниформ-блоке может быть получено из определения юниформ-блока путем применения набора правил, описанных в спецификации OpenGL.

person Sergey K.    schedule 22.07.2013
comment
std430 также является альтернативой. - person AzP; 01.12.2017
comment
@AzP Согласно вики OpenGL, std430 нельзя использовать с юниформ-блоками. (khronos.org/opengl/wiki/Interface_Block_(GLSL)#Memory_layout) - person Charlie Su; 16.11.2019

std140 наиболее полезен, когда у вас есть единый блок, который вы обновляете сразу, например, набор значений матрицы и освещения для рендеринга сцены. Объявите блок с помощью std140 в своих шейдерах, и вы сможете воспроизвести расположение памяти в C с помощью структуры. Вместо того, чтобы запрашивать и сохранять смещения для каждого отдельного значения в блоке из C, вы можете просто glBufferData(GL_UNIFORM_BUFFER, sizeof(my_struct), &my_struct, одним вызовом.

Вам нужно быть немного осторожным с выравниванием в C, например, vec3 будет занимать 4 числа с плавающей запятой, а не 3, но ИМХО это все же намного проще.

person Hugh Fisher    schedule 23.07.2013