GrabDuck

PBR — 1: графоний нового года

:

Это — первая половина моей «дилогии» о PBR/PBS. Да, в одну статью уложить не удалось. Здесь я постараюсь объяснить, «что это вообще такое и с чем его едят». Если тебе интересны лишь анализ и выводы, без понимания сути — всё это будет только во второй части. Она появится скоро.

Вот и прошёл ещё один год. Первый год под безраздельным правлением нового поколения игр, рассчитанных на современные платформы: PS4, PC и… всё :)

Problem with next-gen, XBOX?


Ещё недавно мы с тобой их называли некст-геном, а теперь они царственно воодрузились на трон нынешней эпохи, оставив в прошлом последние релизы для предыдущего поколения.
Вышло уже солидное число исключительно-currentGen-ных проектов, а среди анонсов новых вовсю гремит тяжёлая артиллерия.
Дамы и господа, поздравляю! Момент настал. Мы официально ступили в будущее.

Самое время остановиться на мгновение, проанализировать то, что мы уже получили, и постараться прикинуть, что же нас ждёт в этом дивном новом мире.

Не стану ходить вокруг да около, томя долгими вступлениями. Ты и так уже понял по заглавию: самое важное что нас ждёт — это вездесущий и повсеместный…


… или, сокращённо, PBR.
Также можно встретить аббревиатуру PB S — Physically Based Shading. Это, по сути, то же самое.

Что же за зверь скрывается под этим суровым названием? Сейчас разберёмся. А пока — помните, как вам преподы в вузах говорили: «Забудьте всё, чему вас учили в школе»?
Вот примерно тем же самым PBR является для игростроя. Это новый подход к отрисовке картинки, который порой переворачивает с ног на голову некоторые устои, царившие в играх до сих пор. Всё верно: игрострой дорос до «вышки».

Но прежде, чем окунёмся в пучину графонной аналитики — есть ещё одна вещь, которую хотелось бы отметить. Чем глубже я лезу в подноготную PBR (в том виде, в котором он есть в играх), тем больше мне кажется, что он — это главный символ всего наступившего поколения, его олицетворение, квинтэссенция. В «физическом рендере» проявляются самые сильные и слабые стороны current-gen'а, причём в максимально гипертрофированной форме.

Лирическое отступление для тех, кто долго ждал эту статью

В том числе поэтому я так долго тянул с рассказом про PBR. Ведь это не просто обсуждение ещё одной «фичи». Нет, на мой взгляд, это обсуждение главного столпа, на котором держится всё текущее поколение в целом.
Нельзя просто так взять и рассказать про PBR, вообще не коснувшись того, как его особенности отражаются в глобальном плане.


Поэтому не удивляйтесь, что, говоря о PBR, я буду проводить параллели «вовне». Экстраполировать, так сказать.

... и ещё - про перевод названия

Как и практически все CG-термины, PBR тоже не имеет полноценного аналога по-русски.
В оригинале он называется Physically Based, а не Physically Correct — и это гораздо точнее передаёт суть. То есть, по идее, он не «физически корректный», а, скорее, просто «по физике».
Но «рендер по физике» или «с учётом физики» — не звучит. Поэтому, если уж необходимо перевести — то с натягом, но его зазывают просто физ-корректным. Хотя в профессиональной среде пользуются только английским названием, и в принципе переводить его приходится разве что на конференциях для журналистов.


А начнём с, пожалуй, самого спорного и неоднозначного аспекта этой технологии:


The cake is a lie

Или " PBR — это не PBR", или " GameDev vs VFX", или " PBR в кино и в играх", или…
Короче, тут вот какое дело: когда кто-то произносит магическое словосочетание «Physically Based Rendering» — то вовсе не факт, что он имеет в виду то же самое, что под этими словами понимаем ты или я. И чтобы — элементарно — разобраться в определениях, придётся немного вникнуть в детали. Сорян, без этого — никак (и в том числе поэтому данной статье на «главную» путь заказан).

Итак, конкретно: что же такое PBR? ВНИМАНИЕ: МНОГАБУКАФ! И КАРТИНКИ В СПОЙЛЕРАХ!

Наливай (чая, разумеется), а я пока расскажу тебе кулстори о том, как CG-шники придумали себе религию.

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

В далёком 2010 году одним из таких «заманчивых Франкенштейнов» стал доклад на тему «Physically-Based Shading Models in Film and Game Production». В глубокие технические дебри лезть не будем, но суть его была вот в чём.

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

Вот, например, САМЫЙ БАЗОВЫЙ набор деталей, из которых состоит графон

... или те же яйца, только сбоку


Авторы же этого доклада сказали: «Стоп, хватит». И предложили иной подход: от большей части накопившихся «фэйков» можно отказаться, если самую базу всего рендеринга делать «строго по физике».
С названием для этого подхода мудрствовать не стали, так его и обозвав: «освещение по физике» (Physically-Based Shading).

Идея эта компьютерно-графонному сообществу понравилась. А самые отчаянные сразу после конференции дружно помчались по домам, запиливать «свой новый рендер, с блекджеком и прочим».

В скором времени (конкретно — летом 2013-го года) на сцену вышла небезызвестная студия Pixar, с ответным докладом ( «Physically Based Lighting at Pixar»), заявив, что придумала «тот самый» расово верный физический рендер. И что вообще, её поезда — самые поездатые поезда в мире, так что: «Ну-ка срочно все дружным строем пошли рендерить так, как мы сказали».
За базаром у серьёзных дядей принято следить, поэтому Студия Лампочки с ходу подкрепила свои заявления пруфами, выложив на стол сперва короткометражку «Blue Umbrella» («Синий зонтик»), а потом — полноценный «Университет монстров».


видео: первое явление PBR-а миру

видео: ... и DLC к нему


CG-мир дружно воскликнул: «Wow!» — и все, подобрав отвисшую челюсть, побежали срочно делать свою реализацию «такого-то графона от Pixar».
Но не тут-то было.

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

Но локомотив хайпа уже было не остановить, так что новость о том, что Pixar сделала «самый кошерный» рендер, разлетелась со скоростью детонирующего пукана. А данный доклад многие не глядя нарекли Хрестоматией PBR'а.
Так в киношной графике произошёл раскол, и каждая сторона, ревностно колотя себя пяткой в грудь, начала с пеной у рта доказывать, что вот конкретно её физически корректный рендер — самый физический и самый корректный.

Но и это ещё не всё. Дело в том, что в этом же самом 2013-ом году был другой доклад — от игровой студии DONTNOD, которая рассказала о своём вИдении PBR'а, уже в рамках геймдева. И тоже была далеко не голословной, подкрепив свою позицию феноменальной в графическом плане " Remember Me".

Remember Me и PBR

Я лично считаю, что «Remember Me» феноменальна не только графически, и очень надеюсь когда-нибудь увидеть вторую часть.
А что же касается, собственно, PBR — достаточно будет сказать, что так впечатливший геймеров «The Order 1886» почти целиком построен на тех наработках, которые в своём докладе озвучила студия DONTNOD.

В трейлере, подготовленном для своего выступления, создатели Remember Me не побоялись ставить рядом реальную съёмку и игровую графику. Напоминаю: и это — на предыдущем поколении:


И всё бы ничего, если бы на этом чехарда трактовок прекратилась. Но — нет.
Видимо, в какой-то момент к делу подключились маркетологи (обиженные, что их мнения никто не спросил), начав без разбору лепить наклейку с модным словечком «PBR» на любые мало-мальские изменения в графике, и всё заверте…

Короче.
На сегодняшний день есть несколько разных PBR'ов. Что киношная индустрия, что игровая — ни одна из них пока не определилась до конца, что же конкретно можно считать «физическим рендером», а что — нет. Он буквально превратился в религию, с разными конфессиями, каждая из которых наперебой кричит о том, что именно их Бог — «поистине ТруЪ».
А сам PBR — он, как Господь, непостижим, и продолжает видоизменяться по сей день, с каждым новым докладом становясь всё более корректным.
Есть некоторые базовые принципы, но даже их соблюдение некоторые считают необязательным.

Поэтому сейчас, рассказывая об этом Великом и Ужасном звере, я, в некотором смысле, буду озвучивать ту позицию, которой придерживаюсь сам. Она тоже взялось не из воздуха, и базируется на том, что именно называют «физическим рендером» разработчики Юнити.
Но я в курсе, что, например, в некоторых крупных российских студиях мою трактовку не разделяют.
В корне.


Либо - НЕТ ВРЕМЕНИ ОБЪЯСНЯТЬ! Никто не знает, что такое PBR!

«Физическим рендером» в кино и в играх называют разные вещи. Да ещё и в каждой индустрии есть по несколько трактовок. Я расскажу о той, которой придерживаюсь сам. Короче, ИМХО. Обусловленое тем, что я работаю в Юнити.


Что важно для нас, как для геймеров — это то, что ни одно из PBR-решений (известных мне), не является в полной мере «физически корректным рендером». Скорее, это «ещё гораздо более лучше», чем раньше.
Вот смотри. Нынешний current-gen — он ведь круче предыдущего? Ощутимо круче. И кое-в-чём покоряет новые горизонты. Но не сказать, что PS4 или XBONE сделали какой-то прям-таки революционный скачок вперёд.

То же самое и с PBR.
Он вовсе не означает сверхъестественный гиперреализм, как может показаться из названия. Но, тем не менее, он действительно позволяет сделать игру гораздо более красивой и натуральной.
Вот как именно ему это удаётся…


Базовые принципы физического рендера

Те самые «правила PBR» от Pixar'а — я о них.
В «классическом» рендере во главе угла стояла художественная выразительность картинки. Иными словами, «правильно» — означало «красиво». Всё сводилось к тому, насколько талантливо художники могут нарисовать текстуры. Всё подстраивалось «на глазок», исходя из «творческого в Идения». Но это приводило к тому, что одно и то же приходилось делать несколько раз, под разные условия. Развевающийся флаг в солнечный день? Одна текстура. Тот же флаг, но мокрый под дождём? Другая.
Конечно, при классическом подходе можно было добиться высококлассного результата, но для этого требовалась масса ручной работы. Ведь один и тот же ассет, прекрасно смотревшийся в одних условиях, выглядел кошмарно в любых других.
Так было раньше.

Теперь же «правильно» — это «по физике». То, что рисуют художники, должно иметь какой-то настоящий физический смысл. Это должны быть конкретные параметры реальных поверхностей, а не просто «красивая текстура».
Казалось бы, такой подход напрашивается сам собой, он довольно очевиден. Но всю историю игр (до последнего времени) делать «строго по физике» не позволяли мощности. А как только мы (гейм-девелоперы) стали воспроизводить оптические эффекты в точности так, как требует того наука (по цифрам, а не «на глазок») — оказалось, что нам необходимо фундаментальнейшим образом пересмотреть многие укоренившиеся устои.
Например, оказалось, что…


Абсолютно всё блестит

Некоторые тут же возразят:

Ты втираешь мне какую-то дичь!

Ну как может блестеть матовая бумага или, например, гипс? Сухой кирпич, ткань… да много чего!
Вы таки будете смеяться, но у всех этих материалов тоже есть блеск. Просто он не настолько выраженный, но именно его отсутствие и бросается в глаза.

Взглянем на реальные примеры

Эти изображения — настоящие фото, не рендер. Получены они с помощью поляризационных фильтров. Отсюда — и «паразитные» отблески на всю картинку (от линз фотоаппарата).

Вот как выглядит, казалось бы, чисто матовый картон, если специально отделить блеск от «матового» света:

Теперь — кусок засохшего цемента. Тоже, на первый взгляд, совершенно матовый:

Сухой кирпич:

Ткань:

А теперь — наоборот, казалось бы, чисто-блестящая тарелка («на глазок» — вообще без матовой составляющей):


Глядя на эти фотографии, понимаешь, что буквально все объекты, которые нас окружают, блестят. Почти у всего есть блик. И хотя на первый взгляд он может казаться слабым, когда мы смотрим вдоль поверхности — он уже очень ярко выражен.
То, что получалось «по классике», было похоже скорее на центральный вариант. Хотя должно было быть то, что слева.
PBR восполняет этот пробел, и отныне матовые поверхности будут смотреться гораздо натуральнее. Мы это заметим, в первую очередь, на всевозможных сооружениях и одеяниях персонажей. Бетон теперь выглядит как бетон, камень — как камень, а дерево — как дерево.

Unreal Engine 4 гарантирует это


Не бывает бликов без отражений

Равно как и не бывает дыма без огня.
Со стороны это, опять же, кажется довольно очевидным. Ну разве можно этого не понимать!
Но для игровой графики данный тезис долгое время таковым не был. Всё дело в том, что считать реальные отражения играм не по зубам. Но, с другой стороны, совсем без блестящих предметов — тоже не дело. Поэтому раньше имитировали лишь самый яркий блик, а все остальные отражения оставляли «за бортом».

Вот как имитировали блеск в классике


Увы, но при таком подходе любой блеск выглядел слишком «пластмассово» (ты наверняка наслышан об этом эффекте). Ни тебе золота настоящего, ни воды, ни кожи персонажей.
PBR же поставил игроделов перед фактом: хочешь-не хочешь, а отражения нужны.

... особенно в сравнении с тяжёлой артиллерией


Демонстрация важности отражений на примере Remember Me


Однако сказать «отражения мне запили» — это одно дело, а совсем другое — придумать, как именно это можно сделать. Тут оказались очень кстати две технологии, которые уже давненько используются. Первая из них — это…


Image Based Lighting

Сокращённо — IBL. Примерный перевод на русский — «освещение с помощью изображения».

Суть его вот в чём

В «классике» весь шейдинг (то, как выглядит поверхность) получался всего-навсего из трёх векторов.

Вот конкретика


Такой подход очень ограничивал игроделов. Потому что для того, чтоб считать свет с его помощью, надо заранее условиться: все лампочки в сцене — либо просто точки с нулевым размером, либо абстрактное солнце (бесконечно удалённый источник света, а нам известно лишь, в каком направлении свет падает).
Ага, именно. Тот самый сферический конь в вакууме, так любимый математиками.

Нетрудно догадаться, насколько это далеко от действительности. Ведь в реальной-то жизни свет приходит со всех сторон. Это не какая-то одна или две точки вокруг нас, которые светят.
Нет, это абсолютно всё наше окружение.

Тут-то и выходит на сцену IBL. Вместо того, чтоб освещать некий объект (допустим, персонажа) одной-двумя точечными лампочками, мы создаём специальную текстуру, на которой видно всё то, что этот объект окружает. Мы как бы «рисуем в уме» такую сферу, находясь внутри которой будет казаться, что перед нами то самое реальное окружение, которое запечатлено на картинке:

Такую специальную текстуру, не долго думая, назвали картой окружения (Environment Map, EnvMap).

Осталось лишь размыть её — и вуаля! Теперь она отображает тот свет, который приходит из окружения в каждом направлении.

Имея такую энв-мапу, в игре мы можем её прочитать. Просто «смотрим» тот пиксель, на который направлена нормаль поверхности — и получаем объект, который «освещён картинкой».
Вот так и работает Image Based Lighting.


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

Только направленный свет (солнце)


Но даже не это самое замечательное. Главная прелесть IBL — в том, что у нас уже есть простая текстура, которая описывает всё окружение. Мы уже её размыли — и получили имитацию освещения.

А что если текстуру не размывать? И считывать пиксель не вдоль нормали, а в том направлении, в котором отразится от неё наш взгляд?

Мы получим неплохую имитацию отражений


Пойдём ещё дальше, и подготовим эту энвмапу в нескольких градациях размытия — от абсолютно чёткой до той, которая имитирует свет:

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


Подробный анализ того, в чём же нас IBL ограничивает — оставлю для второй части. А сейчас лишь отмечу два ключевых нюанса.
1. Для того, чтоб сымитировать отражения, нам пришлось заранее сохранить всю сцену в изображение. Это, как нетрудно догадаться, увеличивает размер игр и всё-таки даёт нагрузку. Сам понимаешь: держать в видеопамяти и считывать ещё одну текстуру большого размера — это не бесплатно (хоть и относительно «дёшево»).
2. Опять же, это не «настоящие» отражения: в них видно лишь изображение с карты окружения, но не объекты в сцене. Например, ухо на голове не отразилось, хотя должно было бы. По сути, в отражениях окажется лишь то, что было заранее сохранено в картинку.

Частично проблемы IBL перекрывает вторая «отражательная» техника из арсенала PBR, а именно…


Screen Space (Local) Reflections

«Отражения в пространстве экрана»… короче, просто используй английское название.
Идея «под капотом» этой техники — та же самая, что и в основе IBL:
Реальные отражения геймдеву пока что даже не снятся.
Но можно их сымитировать, если считывать со специальной текстуры нужную область.

Только на этот раз в качестве такой текстуры мы используем не карту окружения, а… сам кадр.
У нас уже есть 2D-картинка того, как выглядит сцена глазами игрока. Так почему бы не получать отражения с неё?
На сей раз пускаться в подробное объяснение того, как именно это делается — не буду. Ты и так уже, наверняка, возненавидел меня за то, что постоянно лезу в дебри. А тут — нужно докапываться до самой сути, чтоб понять принцип (надо понимать, что такое deferred rendering, карта глубины, пасс нормалей и много чего ещё). Так что для самых любознательных — лучше сошлюсь на отличную статью конкретно по SSR (SSLR) (ВНИМАНИЕ! Там автор рубит правду-матку, не стесняясь шейдерного кода).

Сейчас же — лишь обозначу ключевое достоинство SSR: эта техника позволяет отражать не только какую-то заранее посчитанную карту окружения, но и то, что реально происходит в игре прямо сейчас.

А также — отмечу ключевые проблемы этого метода:
1. С помощью SSR отражается лишь то, что видно в кадре прямо сейчас. Потому что мы просто не знаем, что там за краями обзора.

Например, для вот такой сцены

... в чистом виде SSR будет выглядеть вот так

... поэтому нам придётся намеренно скрывать отражения, когда они приближаются к краям экрана


2. Для SSR у нас вся сцена «сплющена» в текстуру. Так что мы не можем получить в отражениях то, что не видим напрямую. Например, если посмотреть на блестящий пол под столом — по идее, там должна отражаться нижняя сторона столешницы. Но мы этого не увидим, потому что в самом кадре этого нет. Именно поэтому Галахад не отражается в зеркалах в «The order: 1886».

Показать анимированную GIF-ку


3. В отличие от IBL-овского подхода, создание размытых отражений через SSR не бесплатно. Там нам было без разницы: что чёткие отражения, что размытые. Тут же — чем размытее, тем дороже. Либо — по мере размытия мы будем терять в качестве отражения.

Тем не менее, без SSR отражения выглядят ещё более ненатурально, поэтому

этой технологией сейчас пользуется каждый шутан

... и вообще любая уважающая себя игра


Даже Unity — движок, испокон веков смотревший в сторону мобилок, недавно пообещал появление SSR «из коробки»:

Видео-демонстрация


мелкий оффтоп про Юнити и мобилки

На самом деле, с пятой версии авторы Unity вообще взялись за ум, и начали потихоньку запиливать фичи, нужные в современных играх. Так что не исключено, что через каких-нибудь полгода этот движок тоже сможет в current-gen. Без «как бы» и «почти», как это было раньше.
И — да — в качестве плагина SSR для этого движка уже существует довольно давно. Но стабильность юнитишных плагинов с AssetStore — это отдельная тема.


Сохранение энергии

Давай взглянем на то, как меняется яркость блика в зависимости от того, насколько сильно поверхность его размывает.

Показать картинку


Всё логично: чем больше блик, тем меньше его яркость. Потому что света на поверхность всё равно падает одинаковое количество. И в одном случае весь пучок отразится в одну сторону, а в другом — рассеивается в разные.

Не поверишь, но даже это раньше не было очевидно. В классическом рендере художники настраивали материалы «на глазок», и редко следили за тем, чтоб два материала с разным бликом визуально отражали одинаковое количество энергии.
При PBR же сохранение энергии решили «узаконить»: поверхность не должна отражать больше света, чем на неё упало. Соответственно, чем ярче блик — тем слабее основной градиент света (так называемый «диффузный» свет). Чем блик больше — тем он слабее.

Это довольно простая мысль, но обязательность её исполнения является мощным фундаментом в PBR. Когда сохранения энергии нет — игрок может и не понять, что именно его смущает. Но картинка выглядит «как-то не так».


Global Illumination (GI)

По-русски — рассеянное освещение.
Да, я про эту технологию уже рассказывал: на примере Voxel Cone Tracing и Geomerics Enlighten.
И — да — конкретно эту технику можно отнести к PBR с огромным натягом. Но она соответствует концепции физического рендера, более чем. Строго говоря, без GI у нас, вообще-то, не соблюдается сохранение энергии. Только не в ту сторону, в которую было раньше (света больше, чем должно быть), а в обратную (света меньше).
Кроме того, известные сейчас способы получить динамический GI (то есть, не посчитанный заранее, а реалтаймовый) выполняют, по сути, ту же задачу, что и IBL. Они реализуют свет от окружения, а не просто из бесконечности/одной точки.
Поэтому на практике GI приходится тесно связывать с IBL, чтоб соблюсти упомянутое выше сохранение энергии. А то, что неразрывно связано с разными аспектами PBR — на мой взгляд, является частью этого самого PBR. Но — подчёркиваю — это моя личная позиция. «По канону» же GI и PBR — совершенно разные вещи.

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

пруф от разработчиков Юнити

... и Unreal Engine



Будущее физического рендера

Как я упомянул в начале, анализировать подводные камни нашего нового трёхбуквенного друга будем во второй части.
Но уже сейчас хотелось бы подытожить всё вышесказанное.
Итак, PBR — это не просто новая техника, не очередная графическая фича, а целый подход к визуализации, который ставит во главу угла науку. И перечисленные мной технологии — не единственные в его арсенале (например, уже сейчас многие считают микрофасетное самозатенение важной, а то и неотъемлимой частью «PBR'ности»).
Одних лишь тех примеров, что привёл в этой статье я, должно быть достаточно, чтоб убедиться: физический рендер по всем фронтам бьёт классику (кроме производительности, но об этом в следующий раз).

Поэтому наше игровое будущее (да и уже настоящее, чего греха таить!) — определённо за этим персонажем.
Я придерживаюсь позиции, что неотъемлемыми частями PBR являются:
1. Сохранение энергии
2. IBL
3. «всё блестит»

или, по-научному - наличие отражений Френеля


Но вся прелесть этого похода в том, что он неизбежно будет развиваться дальше. Теперь, когда мы сняли вуаль «имитаций на глазок», с каждым годом продолжат появляться способы сделать картинку ещё более достоверной — и все они наверняка станут такими же незыблемыми столпами PBR, какими сейчас я считаю эти три.

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

А пока — спасибо за внимание, и удачно провести новогодние праздники!

Всем добра в нашем ближайшем светлом будущем