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

Единообразные по сравнению с атрибутами в GLSL ES

У меня есть некоторые параметры, передаваемые от CPU к GPU, которые являются постоянными для всех фрагментов, но которые изменяются на каждом кадре (я использую GLSL ES 1.1). Должен ли я использовать униформы или атрибуты для таких значений? Атрибуты могут варьироваться от вершины к вершине, поэтому моя интуиция заключается в том, что использование атрибутов для значений, которые являются постоянными во всем кадре, будет неэффективным. Тем не менее, я читал, что униформа предназначена для значений, которые меняются "относительно редко", предполагая, что изменение формы на каждом кадре может быть неэффективным.

Что касается аппаратного обеспечения, меня больше всего интересует оптимизация для iPhone 4S.

4b9b3361

Ответ 1

Я проголосую за униформу.

Одна из причин уже объясняется в вашем вопросе: униформы - это константы для каждой вершины/фрагмента.

Другими причинами предпочтения униформы против атрибутов будут:

  • количество доступных слотов (вам разрешено использовать 16 атрибутов, но гораздо больше униформ)
  • Компиляторы GLSL могут оптимизировать единообразную обработку значений.
  • меньше потоков данных на длинных массивах вершин, меньше атрибута на вершину означает лучшую производительность.
  • форматы доступны в шейдерах фрагментов без определения разных атрибутов между шейдерами вершин и фрагментов
  • униформы могут быть структурами и массивами, что приводит к более читаемому коду.