Освещение в играх. Динамическое освещение и его методы

В данной статье рассмотрим понятие «динамическое освещение» и его методы в теории, а именно о forward render, deferred shading, Light Pre-Pass Render (LPP, deferred lighting).

Предыдущая статья о методах освещения.

Динамическое освещение — метод освещения, при котором расчет освещения происходит в real-time режиме, то есть при рендере сцены, можно сказать для каждого кадра (условно).

Forward render

метод рендера при котором освещение считается в момент рендера. Это классика real-time рендера и динамического освещения, вот и все))

Все просто, рисуем сцену и тут же считаем ее освещение для каждого источника света.Все штатные средства GAPI доступны.

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

Долгое время изучал вопрос на форуме gamedev.ru как я понял в основном для объекта делают возможность освещения до 8 источников. Многопроходной рендера? Это не шибко хорошо.

Плюсы:

  • доступность всех функций GAPI ибо классика жанра

Минусы:

  • ограниченное количество источников света на рисуемый объект

Deferred shading (отложенное освещение)

метод динамического освещения при котором освещение происходит после этапа рендера. Весь цикл делится на 2 этапа:

  • рендер сцены и запись всей информации в G-буфер
  • освещение в пространстве экрана (screen space) на основании данных G-буфера.

G-буфер состоит из нескольких render target (текстур в которые рисуем), то есть это MRT (multiple render tagets) проход при котором одновременно отрисовка будет происходит в несколько render target. Звучит немного запутано, но на деле оказалось все просто, прямо все просто))

Кратко: G-буфер надо разделить по типу информации, к примеру у нас в SkyXEngine используется 4 render taget:

  • цвет rgba (сцена с текстурами)
  • нормали rgb, тип материала — освещаемый/не освещаемый и непрозрачный/полупрозрачный (a)
  • параметры материала rgb, номер материала (a)
  • линейная глубина r

Геометрическая сложность сцены отделена от освещения, а значит нет ограничений по количеству источников света!

При данном подходе недоступен аппаратный антиальясинг — MSAA, что приносит некоторые проблемы. Но это не самое плохое … хуже дела обстоят с рендером полупрозрачных поверхностей — нельзя классическим методом back-to-front (от дальнего к ближнему) отрисовать сцену с альфасмешиванием, ибо в G-буфере будет неверная информация. Но эти проблемы во многом актуальны в DirectX 9, в версиях выше эти проблемы решаются более элегантно.

Deferred shading это динамическое освещение которое набирает все больше и больше популярности.

Плюсы:

  • неограниченное количество источников света (условно)
  • раздельность этапов рендера и освещения

Минусы:

  • проблемы в рендером полупрозрачных поверхностей (есть решения и для DirectX 9)
  • проблемы с антиальясингом (они решаемы посредством post process anti-aliasing, проверено)
  • G-буфер достаточно узкое место, вызывает падение производительности даже на малых сценах

Light Pre-Pass Render (LPP, deferred lighting)

метод динамического освещения, модификация deferred shading, состоящая из двух проходов рендера всей сцены:

  • рендер сцены и запись в G-буфер нормалей и глубины
  • расчет вклада каждого источника света и запись в render target
  • рендер сцены (с использованием уже готового буфера глубины и установкой EQUAL для ztest) и наложение предыдущих расчетов освещения

Примечание: Light Pre-Pass Renderer знаю только в теории

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

Несомненным плюсом данного подхода является малый и стандартизированный объем G-буфера, который не надо менять при внедрении очередной фичи, как это делается в deferred shading.

Плюсы:

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

Минусы:

  • решение проблем с рендером полупрозрачных поверхностей решены не полностью
  • 2 прохода рендера сцены в одном кадре понижают производительность

Каждый из методов освещения используется, и выбирать какой использовать нужно исходя из поставленных требований. В нашем случае выбор пал на deferred shading лишь потому что он показался более перспективным, хотя, мы могли обойтись и forward render (долго использовали именно его).

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

Рекомендую почитать:

Поделиться:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

*

code