Сколько активных шейдеров на одном кадре в игре я должен обычно использовать? 5 или больше, как 100?

20

Сколько шейдеров обычно активны одновременно в одной сцене в современных играх? Я знаю, что используются несколько шейдеров, при этом игры переключаются между ними в каждом кадре, и часто можно рисовать объекты с помощью шейдера:

  1. Нарисуйте все объекты одним шейдером
  2. Изменить с шейдера один на шейдер два
  3. Нарисуйте все объекты с помощью шейдера два

Тем не менее, я знаю, что это не так просто, особенно с такими эффектами, как эффект свечения для всей сцены, рендеринг в текстуру и т. Д., Но я думаю, мы можем предположить, что это работает в большинстве случаев, верно? Подход «группа за шейдером» хорош, потому что переключение шейдеров - дорогостоящая операция.

С одной стороны, у вас не может быть слишком много шейдеров, потому что вы хотите быстро визуализировать сцену. С другой стороны, вам нужно много разных шейдеров (или убер-шейдеров с ветвями - довольно похожих) для кожи, металла, воды и т. Д.

Сколько (и каких) различных шейдеров будет использовать теоретическая, современная игра от третьего лица, 3D-детектив для ПК (DirectX 11, если это имеет значение)? Было бы 5, 20 или более, как 100 активных шейдеров, считая только активные, в некотором «кадре X»? Я знаю, что это не одно число, но мне интересно, какие масштабы и факторы важны для ПК-игры.


В моем примере игры я бы использовал около 9-11 на кадр (считая их разными, маленькими шейдерами или одним убер-шейдером - теперь не имеет значения):

  1. Скин шейдер
  2. Глазной шейдер (не слишком много? Но они разные)
  3. Металлический шейдер
  4. Наземный шейдер
  5. Шейдер снега / дождя (если требуется)
  6. Водный шейдер (если вода существует в сцене)
  7. Светящийся шейдер (только когда задействованы некоторые спецэффекты)
  8. Светоизлучающий шейдер (уличные фонари и т. Д.)
  9. Стандартный шейдер (для всего остального, просто стандартное затенение)
  10. Стандартный шейдер с картами нормалей
  11. 2D шейдер (для графического интерфейса и т. Д.)

Много это или мало? Я забыл о некоторых важных шейдерах, которые мне понадобятся?

PolGraphic
источник

Ответы:

28

Это действительно зависит от техники. В форвард рендере у вас часто есть один шейдер для каждого типа материала. В играх ААА, использующих эту технику, шейдеры часто генерируются из набора опций на материале, который может установить художник. Это может привести к сотням шейдеров (1). Но допустим, что общее количество шейдеров составляет порядка 40

При отложенном затенении / рендеринге вы часто кодируете тип материала в G-буфере, а затем используете один большой шейдер для правильной визуализации разных типов материалов по-разному. Это приводит к гораздо меньшим, но более сложным шейдерам. Допустим, количество шейдеров здесь составляет порядка 5.

(1) Источник: я работал на подрядчика Crystal Dynamics, где я создал инструмент для сокращения числа сгенерированных шейдеров для Tomb Raider, поскольку автоматическая генерация выходила из-под контроля;). Цель состояла в том, чтобы уменьшить количество шейдеров до порядка 40 или что-то в этом роде.

Рой Т.
источник
2
Спасибо за ваш ответ - он был довольно сложным и богатым. Я только что проголосовал за это. Тем не менее, я подожду несколько дней, прежде чем пометить, потому что это довольно «открытый» вопрос - может быть, кому-то еще будет что добавить из собственного опыта. Еще раз спасибо, Рой :)
PolGraphic
s / less /
ошибка
3

Я знаю, что вы хотели получить ответ для ПК. Но я отвечу за то, что я делаю в iOS, и я не ожидаю получить вашу галочку.

Похоже, у вас есть правильная идея. Это будет отличаться для каждого приложения, хотя. В конце концов, это все, что нужно, чтобы получить желаемую частоту кадров. На iPhone моя цель равна 60. Мне не нравится, когда он опускается ниже 30. Когда у меня взрыв с несколькими сотнями анимированных частиц на основе спрайтов, он падает до 30 на iphone5 и намного ниже на 4. Так Я должен принять решение о снижении сложности на определенных устройствах. И иногда это решение влияет на шейдеры.

Но это, как правило, не влияет на количество шейдеров, а скорее на то, какие шейдеры я использую для выполнения задачи на основе моей цели по частоте кадров.

На мой взгляд шейдеры при правильном использовании повышают частоту кадров. У меня есть приложение, которое имеет 80 шейдеров, но оно не использует их все в одном кадре - вероятно, около 10. И оно компилирует их по мере необходимости и отбрасывает их все между сценами. И на моем оборудовании я не видел частоту кадров с эффектом подсчета шейдеров. Только приемы, используемые в шейдере. Но наверняка я думаю, что использование 2 одинаковых шейдеров лучше для частоты кадров, чем наличие более сложного, который разветвляется.

У меня также есть шейдеры, которые снижают качество, если рендеринг идет медленно или на более медленном устройстве. Я использую обычное сопоставление на iPhone 5, но меняю шейдер на тот, который не выполняет обычное сопоставление на iPhone 4.

Мне нравится ответ Роя, и я всегда пытаюсь понять, как создаются "настоящие" игры. Так как я самоучка, я никогда не знаю, является ли мое великое открытие дня именно тем, как это обычно делается, или все же на несколько шагов отстает от настоящих профессионалов.

badweasel
источник
1
Нет проблем с тем, что ваш ответ «для iOS». Я говорил о ПК главным образом потому, что хочу избежать коротких ответов «это зависит от платформы»;) Возможно, ваш ответ не для меня на 100%. Но тем не менее, у него есть некоторые независимые от платформы выводы, так что я нахожу это хорошим. И другие члены сообщества (которые используют iOS) могут найти это еще более полезным, так что спасибо и голосование от меня :)
PolGraphic
1

Вы не можете точно указать, сколько шейдеров вы должны или не должны иметь, поскольку это зависит от ограничивающих факторов вашей игры, а также от целевой платформы. На практике следует придерживаться уменьшения количества активных шейдеров до «только того, которое вам действительно нужно». Иногда это означает, что у вас есть только несколько шейдеров (около 10), а иногда - несколько десятков.

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

Мой опыт с играми ААА до этого момента показал, что пара дюжин активных шейдеров не является необоснованной.

Evan
источник