Что такое отложенный рендеринг?

54

Я слышал об отложенном рендеринге и о том, как его использование может позволить «много» источников света в сцене без огромного снижения производительности, но что это такое и (с высокого уровня), как это реализовано?

тетрада
источник

Ответы:

55

Определяющей характеристикой отложенного рендеринга является то, что он существенно меняет сложность рендеринга сцены с O (геометрия * источники света) на O (геометрия + источники света).

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

(*: Стоит отметить, что разработчики чаще предпочитают хранить глубину и использовать ее для восстановления позиции, поскольку наличие глубины полезно для многих других эффектов. )

После того, как G-буфер сгенерирован, можно вычислить полностью освещенный результат для любого пикселя на экране, решая BRDF ровно один раз на пиксель на свет. Другими словами, если у вас есть 20 сеток, на каждую из которых воздействует 20 источников света, при традиционном («прямом») рендеринге необходимо повторно визуализировать каждую сетку несколько раз, чтобы накапливать результат каждого источника света, воздействующего на нее. В худшем случае это будет один вызов на сетку на свет или 400 общих вызовов! Для каждого из этих вызовов отрисовки вы избыточно ретрансформируете вершины меша. Также есть хороший шанс, что вы будете затенять пиксели, которые на самом деле не зависят от света или не будут видны в конечном результате (потому что они будут перекрыты другой геометрией в сцене). Каждый из этих результатов приводит к потере ресурсов GPU.

Сравнение с отложенным рендерингом: рендеринг сеток требуется только один раз, чтобы заполнить G-буфер. После этого для каждого источника света вы визуализируете ограничивающую форму, которая представляет степень влияния источника света. Для точечного источника света это может быть небольшая сфера или для направленного источника света это будет полноэкранный квад, поскольку затрагивается вся сцена.

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

Однако это не лишено недостатков. Это парадигма, которую очень трудно расширить для обработки прозрачной геометрии (см .: глубинный пилинг). Фактически, это настолько сложно, что практически все реализации отложенного рендеринга возвращаются к прямому рендерингу для прозрачных частей сцены. Отложенный рендеринг также потребляет большое количество VRAM и пропускной способности кадрового буфера, что приводит к тому, что разработчики идут на большие длины, чтобы хитро упаковывать и сжимать атрибуты G-буфера в наименьшие / наименьшие возможные компоненты.

Neverender
источник
8

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

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

Существует множество вариаций, в том числе, например, отображение информации сначала.

См. Для получения дополнительной информации: http://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shading

Винсент Шейб
источник
-3

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

Реализовать это довольно просто. Первый проход требует рендеринга, как минимум, расстояния, нормали и цвета. Вы можете добавить больше текстур для рендеринга как зеркально, так и позиционировать за счет памяти.

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

hellol11
источник
Я не думаю, что это добавляет что-то новое к ответам. Это похоже на перефразированные части ответа Неверендера.
HolyBlackCat
@HolyBlackCat Есть пара важных отличий. Во-первых, это правильное уравнение сложности, а во-вторых, оно гораздо более лаконично, но в то же время объясняет, как на самом деле его реализовать.
hellol11
there's the correct complexity equationПравда. Но я бы сказал, что это мелочь. Вы можете предложить это в качестве правки для другого ответа или оставить комментарий об этом, как только у вас будет достаточно репутации. Делать новый ответ из-за этого немного излишне. it's much more conciseЛично я не думаю, что это хорошо. Чем больше полезных деталей в ответе, тем лучше, не так ли?
HolyBlackCat
1
@HolyBlackCat Точно, да. Лично мне не нравится проходить через текстовую стену, чтобы получить простой ответ.
hellol11