DirectX Raytracing — будущее, которое наступило!

Приветствую,

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

Конвертация геометрии в пиксельное изображение

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

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

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

В отличие от связки из растеризации и трюков для подделки оптических эффектов, трассировка лучей - это честный и физически корректный способ создания изображения.

Процесс трассировки луча (луч стартует из камеры)

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

Благодаря фотореалистичной картинке, трассировка лучей считается своего рода “Святым Граалем” визуализации, но данный метод также всегда оставался недостижимым для интерактивной графики из-за вычислительной сложности и ресурсоемкости. Среди разработчиков бытовала даже шутка, мол, трассировка лучей - будущее и всегда им будет, но вот мы наконец-то подошли к моменту, когда видеокарты стали достаточно производительными для того, чтобы будущее стало явью.

Итак, что же нам сулит DirectX Raytracing?

Фотореалистичные отражения

Фрагмент из демонстрации трассировки лучей Futuremark на GDC18

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

Слой с отражениями из доклада SEED team по демонстрации Pica Pica

Другой популярной техникой создания отражений в современных играх являются отражения в пространстве экрана, как можно заметить, таковые упускают большую часть деталей сцены. Это происходит из-за отсутствия необходимой информации об обратной стороне геометрии и отсутствия многих объектов в кадре, т.к. Screen-Space Reflections отражают только те объекты, которые мы наблюдаем в кадре и только с видимой стороны. Напротив, отражения методом трассировки луча захватывают все делали сцены как с видимой, так и с обратной стороны геометрии, объекты не попадающие в кадр также отражаются, что выливается в отражения без пропавших частей и прочих неприятных ошибок свойственных Screen-Space техникам.

Фотореалистичные тени

Сравнение теней методом трассировки с теневыми картами

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

Несколько теней, теневые карты
Несколько теней, теневые карты
Несколько теней, трассировка лучей
Несколько теней, трассировка лучей

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

Узнать больше о RayTracing тенях вы можете в этом видео - https://bit.ly/2Jmz88W

Фотореалистичное освещение

Слой с фоновым затенением из демонстрации Pica Pica

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

И это только начало, за кадром остались каустики, глобальное освещение, полупрозрачные объекты и прочие эффекты, каждый из которых с трассировкой способен преобразить картинку в сторону большего реализма. Все примеры выше взяты из демонстраций с GDC 2018, но как получилось, что с анонсом DirectX Raytracing сразу был показан целый ворох первоклассных технических примеров с сюжетом и постановкой? Как разработчики успели сделать все это?

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

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

The thing to keep in mind however, and why raytracing is so awesome here, is that this rendering pipeline doesn’t require any tweaking. You just enable it, and get good results by default © SEED team
The thing to keep in mind however, and why raytracing is so awesome here, is that this rendering pipeline doesn’t require any tweaking. You just enable it, and get good results by default © SEED team

Фактически, как Кольт, трассировка поможет уравнять больших и маленьких разработчиков в правах. Если раньше освещение и отражения средней руки могли себе позволить только крупные студии с десятками дизайнеров и художников, то с трассировкой лучей разительно более качественных результатов может добиться даже небольшая студия, что мы и видим на примере демонстрации Pica Pica от SEED team.

Предвидя подобную перспективу, EPIC, Unity и ряд других крупных компаний уже анонсировали поддержку DirectX Raytracing в своих супер-популярных движках. Можно сказать, что трассировка лучей буквально в шаге от наших игровых систем!

Часть 2.

DirectX Raytracing — необходимость.

Мы уже много рассказали о преимуществах трассировки. Но не объяснили в деталях почему возникла необходимость в DirectX Raytracing. Что должно побудить индустрию к переходу на новые инструменты?

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

В растеризации, при конвертировании векторной геометрии в пиксельное изображение (растровое), все объекты обрабатываются независимо и выводятся строго в последовательном порядке вызовов отрисовки созданных приложением, как на анимации ниже:

Последовательность вызовов отрисовки и растеризация в кадровый буфер

Представим, что литеры алфавита — последовательность моделей, которые отправляются на отрисовку, по очередности сначала будет выведен объект “А”, затем “Б” и последним — “Я”, каждая модель пройдет через все этапы конвейера — трансформации в вершинных / тесселяционных / геометрических шейдерах, конвертацию полигональной сетки в пиксельные фрагменты изображения (пиксели, принадлежащие растеризированному примитиву), текстурирование, изменение цвета фрагментов изображения в пиксельных шейдерах, смешивание полупрозрачных поверхностей и, наконец, запись пикселей в изображение (кадровый буфер).

Типичный конвейер растеризации
Типичный конвейер растеризации

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

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

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

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

Развернутая кубическая карта
Развернутая кубическая карта

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

Статичные кубические карты, все совпадения с реальностью — случайность
Статичные кубические карты, все совпадения с реальностью — случайность

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

Планарные отражения в Alien: Isolation
Планарные отражения в Alien: Isolation

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

На асфальте можно наблюдать отражения на основе изображений
На асфальте можно наблюдать отражения на основе изображений

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

DirectX Raytracing — будущее, которое наступило!, image #9
Этапы создания ассетов для отражений в игре Thief (2014)
Этапы создания ассетов для отражений в игре Thief (2014)

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

Процесс растеризации слоев геометрического буфера в GTA V

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

Загадочное исчезновение отражений в экранном пространстве

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

Однако текущую ситуацию призван исправить DirectX Raytracing, с новым АПИ у разработчиков наконец-то появились полноценные инструменты для создания игр с фотореалистичным освещением и отражениями. DirectX Raytracing понижает порог вхождения для разработки игр с фотореалистичной графикой, теперь и небольшие студии могут себе позволить разработку реалистичных игр. Крупным студиям DirectX Raytracing поможет сконцентрироваться на создании масштабных игр с более разнообразным наполнением, большей степенью интерактивности и, конечно, интересным игровым процессом. Ситуация, когда все в выигрыше!

6345 views·36 shares