Тени в отложенном рендеринге

12

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

Если начать рендеринг shadowmaps, то, кажется, в значительной степени так же, как вперед rendering- вы воздали всю геометрию в сцене для каждого света для визуализации shadowmaps.

Так как же отложенный рендеринг выполнить тень эквивалентна вперед рендеринг?

DeadMG
источник

Ответы:

14

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

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

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

Натан Рид
источник
1
Если вы очень умны, вы можете попробовать использовать геометрический шейдер во время создания GBuffer, чтобы «встроить» создание карты теней (как в примере с картой куба DX10). Я не уверен , если это было сделано, если это вообще возможно , или , если это будет медленнее , в конце концов - но это принесло бы создание карт теней ближе к отложенному затенению, или в определение в зависимости от вашей религии.
Джонатан Дикинсон
6

Ну, что такое карта теней? Карта теней - это текстура, тексты которой отвечают на простой вопрос: на каком расстоянии от света, в направлении, представленном текселем, свет перекрыт? Координаты текстуры генерируются с использованием различных проективных средств текстурирования, в зависимости от конкретного алгоритма отображения теней.

Проективное текстурирование - это просто способ преобразования объекта в пространство текстуры (и да, я знаю, что это звучит задом наперед. Но так оно и работает). Алгоритмы отображения теней используют несколько различных видов преобразований. Но, в конечном счете, это просто превращения из одного пространства в другое.

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

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

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

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

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

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

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

Задача решена.

Николь Болас
источник
Можно ли исключить геометрию за свет в отсроченном рендеринге (для оптимизации)?
Samaursa
@Samaursa: «Исключить геометрии за свет» от чего? Из вдаваясь в теневой карте? От освещаться?
Никол Bolas
Я вижу, вы ответили на вопрос об этом, спасибо. Для других, если они хотят следить за вопросом / ответом: gamedev.stackexchange.com/q/178755/2287
Самаурса