Сколько шейдеров обычно активны одновременно в одной сцене в современных играх? Я знаю, что используются несколько шейдеров, при этом игры переключаются между ними в каждом кадре, и часто можно рисовать объекты с помощью шейдера:
- Нарисуйте все объекты одним шейдером
- Изменить с шейдера один на шейдер два
- Нарисуйте все объекты с помощью шейдера два
Тем не менее, я знаю, что это не так просто, особенно с такими эффектами, как эффект свечения для всей сцены, рендеринг в текстуру и т. Д., Но я думаю, мы можем предположить, что это работает в большинстве случаев, верно? Подход «группа за шейдером» хорош, потому что переключение шейдеров - дорогостоящая операция.
С одной стороны, у вас не может быть слишком много шейдеров, потому что вы хотите быстро визуализировать сцену. С другой стороны, вам нужно много разных шейдеров (или убер-шейдеров с ветвями - довольно похожих) для кожи, металла, воды и т. Д.
Сколько (и каких) различных шейдеров будет использовать теоретическая, современная игра от третьего лица, 3D-детектив для ПК (DirectX 11, если это имеет значение)? Было бы 5, 20 или более, как 100 активных шейдеров, считая только активные, в некотором «кадре X»? Я знаю, что это не одно число, но мне интересно, какие масштабы и факторы важны для ПК-игры.
В моем примере игры я бы использовал около 9-11 на кадр (считая их разными, маленькими шейдерами или одним убер-шейдером - теперь не имеет значения):
- Скин шейдер
- Глазной шейдер (не слишком много? Но они разные)
- Металлический шейдер
- Наземный шейдер
- Шейдер снега / дождя (если требуется)
- Водный шейдер (если вода существует в сцене)
- Светящийся шейдер (только когда задействованы некоторые спецэффекты)
- Светоизлучающий шейдер (уличные фонари и т. Д.)
- Стандартный шейдер (для всего остального, просто стандартное затенение)
- Стандартный шейдер с картами нормалей
- 2D шейдер (для графического интерфейса и т. Д.)
Много это или мало? Я забыл о некоторых важных шейдерах, которые мне понадобятся?
Я знаю, что вы хотели получить ответ для ПК. Но я отвечу за то, что я делаю в iOS, и я не ожидаю получить вашу галочку.
Похоже, у вас есть правильная идея. Это будет отличаться для каждого приложения, хотя. В конце концов, это все, что нужно, чтобы получить желаемую частоту кадров. На iPhone моя цель равна 60. Мне не нравится, когда он опускается ниже 30. Когда у меня взрыв с несколькими сотнями анимированных частиц на основе спрайтов, он падает до 30 на iphone5 и намного ниже на 4. Так Я должен принять решение о снижении сложности на определенных устройствах. И иногда это решение влияет на шейдеры.
Но это, как правило, не влияет на количество шейдеров, а скорее на то, какие шейдеры я использую для выполнения задачи на основе моей цели по частоте кадров.
На мой взгляд шейдеры при правильном использовании повышают частоту кадров. У меня есть приложение, которое имеет 80 шейдеров, но оно не использует их все в одном кадре - вероятно, около 10. И оно компилирует их по мере необходимости и отбрасывает их все между сценами. И на моем оборудовании я не видел частоту кадров с эффектом подсчета шейдеров. Только приемы, используемые в шейдере. Но наверняка я думаю, что использование 2 одинаковых шейдеров лучше для частоты кадров, чем наличие более сложного, который разветвляется.
У меня также есть шейдеры, которые снижают качество, если рендеринг идет медленно или на более медленном устройстве. Я использую обычное сопоставление на iPhone 5, но меняю шейдер на тот, который не выполняет обычное сопоставление на iPhone 4.
Мне нравится ответ Роя, и я всегда пытаюсь понять, как создаются "настоящие" игры. Так как я самоучка, я никогда не знаю, является ли мое великое открытие дня именно тем, как это обычно делается, или все же на несколько шагов отстает от настоящих профессионалов.
источник
Вы не можете точно указать, сколько шейдеров вы должны или не должны иметь, поскольку это зависит от ограничивающих факторов вашей игры, а также от целевой платформы. На практике следует придерживаться уменьшения количества активных шейдеров до «только того, которое вам действительно нужно». Иногда это означает, что у вас есть только несколько шейдеров (около 10), а иногда - несколько десятков.
Один из способов ограничить количество перестановок, возникающих в вашей игре, - реализовать технику «убершадера», с помощью которой почти каждый шейдер получен из единственного шейдера, а различия и особые поведения меняются с помощью препроцессора. Конечно, есть исключения для специальных эффектов, таких как глубина резкости, окружающая окклюзия и так далее.
Мой опыт с играми ААА до этого момента показал, что пара дюжин активных шейдеров не является необоснованной.
источник