Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Физически обоснованный рендеринг — Часть вторая

Физически обоснованный рендеринг — Часть вторая

Опубликованно: 06.06.2017, 6:29
Последняя редакция, Andry: 08.06.2017 14:47

В предыдущей части я объяснял, что вам нужно знать о Физически Обоснованном Рендеринге, если бы вы были художником. Если вы разработчик и читаете эту статью, вы, возможно, попробовали или планируете внедрить свою собственную систему PBR. Если вы начали читать какую-то доступную литературу, вы, вероятно, были поражены ее математической сложностью и отсутствием объяснения дающего представления об этом в целом. Обычно вы видите статьи, в которых основное внимание уделяется специфическим частям процесса, и не говорят больше о других частях, поскольку они считаются более легкими. В какой-то момент вы должны собрать все эти части, и мне было трудно понять, как это сделать из того что я читал. Я считаю, это обдуманный базовый материалом для других авторов, и я думаю, что он заслуживает надлежащего объяснения.

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

Вы можете найти разъяснение лексики, в конце, по всем странными словам, с которыми вы столкнетесь, и их объяснениями.

Итак, вот что я понял об использовании PBR и освещении в целом в 3D-рендеринге.

Освещение

Итак, во-первых, давайте поговорим о освещении в играх. Все это сводится к двум вещам:

  • Вычисление Диффузного отражения: это отражение света, от отражающей поверхности во всех направлениях
  • Вычисление Зеркального отражения: это отражение света, от отражающей поверхности непосредственно на ваши глаза.

Это изображение из википедии является самым простым и, тем не менее, самым полезным для понимания этого

Lambert2

GianniG46 (Собственная работа) [CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0) или GFDL (http://www.gnu.org/copyleft/fdl.html) ], через Викисклад

Чтобы вычислить каждый из этих факторов, мы будем использовать функцию. Эта функция имеет непростое название, Двулучевая функция отражательной способности(Bidirectional Reflectance Distribution Function) или ДФОС(BRDF).

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

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

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

Освещение в PBR

Вычислительное освещение для PBR точно такое же, как и при текущем рендеринге (система, которую мы используем сегодня с окружающей(ambient), диффузной(diffuse), зеркальной(specular), иногда называют в литературе ad-hoc-системой):

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

Итак, что такое источник света?

Направленный источник света(Direct light source)

Что-то, что излучает свет. В играх наиболее распространенными источниками света являются Направленный(Directional) свет (думайте о солнце), Прожектор(Spot) (думайте о свете факела), Точечные(Point) свет (думайте о лампочке).

Это то, что обычно используется в ad-hoc-системе, и PBR также обрабатывает эти типы освещений.

Источник отраженного света(Indirect light source)

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

Это не обрабатывается системой ad-hoc или очень плохо подделывает окружающее освещение.

Эта часть является необязательной для PBR, но на самом деле эта часть вам действительно нужна. Потому что это то, что делает вещи красивыми!

В играх отраженное освещение выполняется с использованием Карты текстуры фона(environment map) в качестве источника света. Этот метод называется Image Based Lighting (IBL).

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

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

Таким образом, псевдокод для полного освещения это:

//направленное освещение
for each directLightSource {
    directDiffuseFactor = DiffuseBRDF(directlightSource)
    directSpecularFactor = SpecularBRDF(directLightSource)
    directLighting += Albedo * directDiffuseFactor + SpecColor * directSpecularFactor
}

//отраженное освещение, выполненное с Image Based Rendering с помощью Карты текстуры фона(environment map)
indirectDiffuseFactor = DiffuseBRDF(EnvMap)
indirectSpecularFactor = SpecularBRDF(EnvMap)

indirectLighting = Albedo * indirectDiffuseFactor + SpecColor * indirectSpecularFactor

Lighting = directLighting + indirectLighting

Я буду вдаваться в подробности, в серии постов, о том, как вычислить все факторы, но это довольно много.

Выбор вашего BRDF

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

Я решил использовать тот же BRDF, что и в Unreal Engine 4, из этой статьи Брайана Кариса, поскольку я полностью доверяю его мнению. Предоставленный код помог многим, но он был далеко не подходящим для интеграции. В конце концов мне пришлось полностью все изучить что бы понять все местонахождения BRDF.

Диффузный BRDF: Ламберт(Lambert)

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

DiffuseLambert

Диффузный Ламберт(Diffuse Lambert) коэффициент для направленного источника света с желтым цветом поверхности.

Некоторые альтернативы:

Oren-Nayar: дает лучшие визуальные результаты, чем классический Ламберт, и имеет преимущество использования entry parameter, называемого шероховатостью … rings a bell? К сожалению, дополнительные расчетные затраты на самом деле не стоят того, IMO. Подробнее здесь

Harahan-Krueger: Принимает во внимание субповерхностное рассеяние для диффузного освещения (каждая поверхность материала имеет слои и рассеивает свет через разные слои перед выходом из материала в случайном направлении). Множество вычислений по сравнению с Ламбертом, но может быть важным, если вы хотите, чтобы хорошо выглядело субповерхностное рассеивание например для кожи,. Подробнее в этой статье

Зеркальный BRDF: Cook-Torrance

Это немного сложнее для зеркального отображения. Нам нужен физически правдоподобный BRDF. Мы используем так называемый Microfacet BRDF. Так что это?

Он утверждает, что на микроуровне поверхность не плоская, а образованная из множества маленьких случайно выровненных поверхностей, микрограней. Эти поверхности действуют как маленькие зеркала, отражающие входящий свет. Идея этого BRDF заключается в том, что только некоторые из этих граней могут быть ориентированы так, чтобы входящий свет отражался на ваши глаза. Чем более гладкая поверхность, тем больше граней выровнены, и получается наиболее аккуратное отражение света. Напротив, если поверхность грубая, грани сильнее ориентированы отражение случайным образом, поэтому отражаемый свет рассеивается на поверхности, и отражение выглядит более размытым.

Specular

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

Microfacet BRDF, который мы используем, называется Cook-Torrance. Из того что я читал, я не смог найти никакой реализации, использующей другой зеркальный BRDF. Похоже, что это основная разновидность для любого микрогранного BRDF.

F = D * F * G / (4 * (N.L) * (N.V));

N.L — это пятнышко произведеное между нормалью затененной поверхности и направлением света.

N.V — это пятнышко произведеное между нормалью затененной поверхности и направлением обзора.

Другие термины:

  • Функция нормального распределения(Normal Distribution Function) сокращенно D (для распределения). Вы также можете найти некоторые отсылки на неё в виде NDF. Она вычисляет распределение микрограней для затененной поверхности
  • Fresnel factor сокращенно F. Обнаруженный Августином Френелем, он описывает, как свет отражается и преломляется на пересечении двух разных сред (чаще всего в компьютерной графике: воздух и затененная поверхность)
  • Geometry shadowing сокращенно G. Определяет затенение для микрограней

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

Я решил использовать эти модели и приближения:

  • D : Trowbridge-Reitz/GGX функция нормального Распределения.
  • F : Fresnel term Schlick’s аппроксимация
  • G : Schlick-GGX аппроксимация

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

Это подводит некоторый итог всему процессу, но многое еще предстоит объяснить. В следующем посте я сделаю акцент на отраженном освещении, так как эта часть, далась мне труднее всего для понимания. Я объясню используемую технику Image Based Lighting и то, как вы можете вычислять диффузные и зеркальные изображения из карты окружения(Environment Map).

Следующая часть

Термины:

Диффузное отражение(Diffuse reflection): свет, отражающийся от поверхности во всех направлениях.

Зеркальное отражение(Specular reflection): свет, отражающийся от поверхности к зрителю.

Двулучевая функция отражательной способности(Bidirectional Reflectance Distribution Function) или ДФОС(BRDF): функция для вычисления диффузного или зеркального отражения.

Image Based Rendering или IBL: метод, который использует изображение в качестве источника света

Microfacet Specular BRDF: зеркальный BRDF, который предполагает что поверхность, выполнен из множества очень маленьких случайно выровненных поверхностей: микрограней. Он зависит от трех факторов, сокращенно называемых здесь D, F и G.

Функция нормального распределения(Normal Distribution Function) сокращенно D (для распределения). Вы также можете найти некоторые отсылки на неё в виде NDF. Она вычисляет распределение микрограней для затененной поверхности

Fresnel factor сокращенно F. Обнаруженный Августином Френелем (французы настолько умны), он описывает, как свет отражается и преломляется на пересечении двух разных сред (чаще всего в компьютерной графике: воздух и затененная поверхность)

Geometry shadowing сокращенно G. Определяет затенение для микрограней.


Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

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

jMonkeyEngine.ru © 2017. Все права сохранены.