Поскольку в данная статься очень объемная, мы решили разделить ее на две части. Вторую вы можете прочитать здесь.
Несколько месяцев назад компания Nvidia практически в одиночку решила расширить внедрение технологии Ray Tracing, после чего некоторые разработчики игр и игровых движков решили поддержать развитие данной технологии. Недавнее обновление драйвера для GTX видеокарт позволяет использовать Ray Tracing миллионам новых пользователей и некоторые, самые производительные карты смогут пополнить ряды приверженцев новой технологии. Вместе с тем и сама технология трассировки лучей находит все большее применение в игровой индустрии.
При попытке объяснить сложную технологию рендеринга простым языком, все может скатиться к излишнему упрощению, в особенности если этим занимаются отделы маркетинга и продаж. Вместе с тем при попытке объяснить, что же на самом деле такое трассировка лучей и как она работает мы можем столкнуться с непониманием того, почему эта технология столь важна и революционна.
Самые выгодные предложения видеокарт на этой неделе
Мы хотим углубиться не только в тему того, чем на самом деле является трассировка лучей, но и также в конкретные методы трассировки. Дополнительно постараемся объяснить, как эти методы работают и почему важны. Наша задача состоит не только в том, чтобы получить более детальное представление о том, почему трассировка лучей важна и почему Nvidia делает на нее большую ставку, но также и в том, чтобы показать вам как определить различия между сценами с трассировкой лучей и без нее, и подчеркнуть почему такие сцены выглядят лучше.
Краткий экскурс в компьютерную графику и растеризацию
Создание виртуальной симуляции окружающего нас мира – это крайне сложная задача. Настолько сложная, что никто по-настоящему даже не пытался достичь этого в играх. Забудьте на мгновение о гравитации и физике, просто подумайте о том, как мы видим мир вокруг нас. Бесконечное число фотонов (пучков света) движется вокруг, отражаясь и проходя сквозь объекты. И все это основано на молекулярных свойствах каждого объекта.
При попытке симулировать «бесконечность» с помощью ограниченного количества ресурсов, например, компьютера, неминуемо приведет к неудаче. Необходимо использовать разумные допущения, которые и применяются при рендеринге графики в современных играх.
Этот процесс называется растеризацией. Вместо того чтобы рассматривать бесконечное количество объектов, поверхностей и фотонов он начинается с полигонов – в частности, треугольников. Игры перешли от использования сотен полигонов к миллионам, а растеризация превращает все эти данные в 2D фреймы (кадры) на ваших мониторах.
В этом понятии много математики, но если постараться объяснить человеческим языком, то растеризация определяет какую часть экрана покрывает каждый полигон. При близком рассмотрении один треугольник может покрывать всю площадь экрана, однако при большем удалении и взгляде под углом, он может покрывать лишь несколько пикселей. Как только пиксели были определены, необходимо наложить текстуры и просчитать освещение.
Делать это для каждого полигона, для каждого кадра крайне расточительно, поскольку множество полигонов могут быть не видны в текущий момент (скрыты за другими полигонами). За прошедшие годы различные графические методы и оборудование улучшились, что позволило значительно ускорить растеризацию. Современные игры могут учитывать миллионы потенциально видимых полигонов и обрабатывать их с невероятной скоростью.
Разработчики прошли путь от примитивных полигонов с «фальшивыми» источниками освещения (как например в оригинальном Quake), к более сложным окружениям с картами теней, мягкими тенями, освещением Ambient Occlusion, тесселяцией, отражениями пространства экрана и другими графическими методами, чтобы попытаться создать более приближенные к реальному игровые миры. Это может потребовать миллиардов вычислений для каждого фрейма, однако с современными ГПУ, способными обрабатывать несколько терафлопс (триллионов операций в секунду) данных эта проблема решаема.
Что такое Ray Tracing?
Трассировка лучей – это иной подход, впервые освященный Тернером Уитедом в 1979 году в труде «Улучшенная модель освещения для затененного дисплея» (PDF версия). Тернер описал, как рекурсивно рассчитать трассировку лучей, чтобы получить впечатляющее изображение с тенями, отражениями и многим другим. (Не случайно, что Тернер Уитед теперь работает в исследовательском отделе Nvidia.) Проблема в том, что для этого требуются гораздо более сложные вычисления, чем при растеризации.
Трассировка лучей включает в себя отслеживание пути луча (света) в 3D сцене. Необходимо спроецировать луч на один пиксель в 3D сцене, чтобы узнать на какой конкретно полигон он попадает, а затем следует раскрасить этот полигон в соответствующий цвет. На практике необходимо рассчитать намного больше лучей на один пиксель, чтобы получить хороший результат, поскольку, как только луч достигает объекта необходимо просчитать источники освещения, которые могут достичь этой точки полигона (дополнительные лучи), и вместе с тем просчитать дополнительные лучи основываясь на свойствах полигона (его способность к отражениям, цвет материала, форму и т.д.).
Чтобы определить количество света, падающего на один пиксель от одного источника света, для формулы трассировки лучей должны быть известны насколько далеко распространяется свет, его яркость и угол отражающей поверхности относительно угла источника света. Только после нахождения этих значений возможно просчитать то, как отражается луч. Затем процесс повторяется для остальных источников света, включая косвенное освещение от других объектов в сцене. Расчеты должны быть применены к материалам с учетом их коэффициентов диффузного и зеркального отражения. Прозрачные или полупрозрачные поверхности, такие как стекло или вода преломляют лучи, создавая дополнительные сложности при рендеринге. Вместе с тем все обязательно имеет искусственный предел отражения, потому что без него лучи могут отражаться бесконечно.
В чем разница между Windows 10 Home и Pro?
По сообщениям Nvidia наиболее часто используемый алгоритм трассировки лучей – это Bounding Volume Hierarchy Traversal (обход иерархии ограничивающих объемов). Это то, что используется в DXR (DirectX Ray Tracing) API и то, что ускоряют RT ядра Nvidia. Основная идея состоит в том, чтобы оптимизировать вычисления пересечения луча/треугольника. Возьмите сцену с тысячами объектов, каждый с потенциально тысячами полигонов и затем попытайтесь выяснить какие полигоны пересекают лучи. Это серьезная проблема поиска, которая требует много времени для подбора. BVH ускоряет этот процесс создавая древо объектов, каждый из которых заключен в собственный блок.
В качестве примера Nvidia использует модель кролика, которую пересекает луч. На самом верхнем уровне BVH блок содержит в себе всю модель кролика и вычисления определяют, что луч пересек этот блок. Если же блок пересечен не был, то и никакой работы над этим блоком/объектом/BVH производить не требуется. Поскольку в нашем случае пересечение было установлено, BVH алгоритм получает набор меньших блоков для пересекаемого объекта и в конечном итоге находит точку, расположенную на голове кролика. Дополнительные BVH пересечения происходят до тех пор, пока алгоритм не получит фактический список полигонов, которые он затем может проверить, чтобы определить с каким полигоном пересекается луч.
Эти BVH вычисления могут быть выполнены при помощи программного обеспечения как на ЦПУ, так и на ГПУ, однако выделенное оборудование может ускорить этот процесс на порядок. RT ядра карт Nvidia RTX циклически выполняют всю работу связанную с лучом и BVH структурой, а затем выдают желаемый результат – полигон, который был пересечен лучом.
Это недетерминированная операция, что означает, что невозможно точно сказать насколько много лучей может быть просчитано в секунду, поскольку это зависит от сложности сцены и структуры BVH. Важно отметить, что Nvidia RT ядра могут обрабатывать BVH алгоритм примерно в 10 раз быстрее ядер CUDA, что в свою очередь примерно в 10 раз или более быстрее, чем выполнение просчетов на ЦПУ (в основном это связано с количеством ГПУ ядер в сравнении с ЦПУ ядрами).
Сколько лучей на пиксель будет «достаточно»? Это значение варьируется поскольку значительно проще иметь дело с прямыми поверхностями без отражений, чем с изогнутыми и отражающими свет. Если лучи падают на объекты с сильными отражениями (например, зеркала), то может потребоваться сотни лучей. Выполнение полной трассировки лучей для сцены может привести к просчету десятков или даже большего количества лучей на пиксель. При этом с бОльшим количеством лучей можно достичь лучших результатов.
Видеокарты AMD Navi засветились в бенчмарках
Несмотря на сложность, почти каждый крупный фильм в наши дни использует трассировку лучей (или трассировку путей) для создания высокодетализированных компьютерных изображений. Полнометражный 90-минутный фильм, 60 кадров в секунду потребует примерно 324 000 кадров, и обработка каждого кадра может занять целые часы вычислительного времени. Как игры могут делать все это в режиме реального времени на одном графическом процессоре? Ответ кроется в том, что получаемые кадры будут иметь меньшее разрешение и качество, чем в голливудских фильмах.
Часть 2
Не забудьте подписаться и поставить лайк. Впереди будет еще много крутых статей.