Проблемы трассировки лучей — из будущего в реальное время, часть 2
Примеры
3D шутер
Рассмотрим, например, такую сцену. Скриншот из недавно вышедшего мегабюджетного 3D-шутера, который сразу побил рекорды продаж и принес сотни миллионов долларов:
Можно сразу сказать, эту сцену рисовать методом трассировки лучей просто не выгодно. Для того, чтобы получить такую картинку, просто потребуется на порядок более дорогая система с большим количеством транзисторов. В этом игровом уровне дело происходит светлым днем, солнце висит высоко в небе и ярко освещает город, на улицах которого спецназовцы ведут бой.
Для сюжета игры главное нарисовать город и дома по-детальнее, со всеми комнатами и лесенками. Помещения наполнить объектами и, самое главное, нарисовать модели оружия и самих бойцов.
Освещение считается почти статическим, только вспышки выстрелов и разрывы гранат нарушают монотонную идиллию солнечного дня. Но эти вспышки тоже можно рисовать приближенно, засветляя определенные области экрана. Так можно легко создать, до некоторой степени, ощущение реальности, используя сильную адаптивность человеческого зрения к освещению. То есть, нам тут трассировка лучей просто не нужна.
Где вы в реальном городе найдете эффекты преломления, например? В очень, очень редких местах, например, какой-нибудь стеклянный купол особенного здания. И из-за одной сцены переходить на радикально другой метод, который все остальные части уровня отрисовывает не эффективно?
Природа
Вот другой пример, лес и пруд. На этот раз это не скриншот из компьютерной игры. Представим, нам нужно примерно такую сцену нарисовать в игре.
Сразу можно отметить, что освещение почти полностью рассеянное. Солнце скрыто за облаками. Теней вообще нет, просто дальние деревья скрываются в темноте чащи леса.
С помощью растеризации такую сцену можно нарисовать так: модели стволов и основных веток изобразить с помощью треугольников, а ветки изобразить спрайтами. Дальние деревья скрыть туманом.
Сложнее с поверхностью воды, но можно нарисовать сцену с точки зрения воды, а потом с помощью шейдеров несколько исказить картинку при наложении изображения на поверхность пруда, и получить что-то похожее на рябь. Или просто изображение будет как бы плавать на волнах, что не вполне реалистично, но не так плохо смотрится. Особенно, если волны достаточно пологие.
Впоследствие, можно все ветви деревьев представить, как модели из треугольников, а только листочки изобразить спрайтами. Очевидный путь увеличения детализации с ростом мощности.
А что может предложить метод трассировки лучей? С точки зрения рисования деревьев, ничего хорошего. Каждый луч придется пересекать с массой объектов, этих мелких веточек. Это крайне вычислительно сложно. Но, самое главное, это модель освещения. В этой сцене освещение рассеянное, мы не можем просто провести луч из точки объекта в направлении солнца и проверить, затенен ли он. Если мы, при отрисовке этой сцены, просто направим лучи вверх в небо из точек объектов, чтобы проверить, затенены ли они или освещены льющимся из облаков светом, то мы получим малореалистичную картинку. Будут некрасивые и неестественные тени на ветвях деревьев с резкими границами. Деревья так никогда не выглядят, потому что свет рассеивается в кронах деревьев и в воздухе.
Потому, что в этой сцене свет льется как будто из ниоткуда, его отражает и водная гладь, и поверхность земли, и сами листья. И приближенная модель освещения, которая считает, что оно постоянно, будет выглядеть более реалистично, чем приближение первого порядка, полученное с помощью трассировки лучей, с неестественными резкими тенями.
Другое дело, что мы можем применить более сложный вариант трассировки лучей. Например, трассировать из каждой точки объекта лучи в разных направлениях, чтобы узнать, сколько вторичного не прямого света приходит в данную точку. Найти пересечения этих лучей с другими объектами сцены, выяснить коэффициент рассеяния материалов, определить, сколько первичного света приходит и сколько объект может отразить в направлении исходного объекта.
В данном случае, видимый объект не освещается прямым светом, но может освещаться рассеянным, который можно примерно рассчитать, выпуская лучи в разные стороны из видимой точки. Так мы получим лучшее приближение реального рассеянного освещения сцены. Но оно будет требовать на два порядка больше вычислительных ресурсов, и все равно не будет полностью реалистичным.
Но трассировка лучей может помочь получить красивые реалистичные отражения от ряби на поверхности пруда. Ведь когда наш виртуальный луч попадет на поверхность воды, он отразится в зависимости от фазы бегущей волны, в которую он попал. И, проследив путь отраженного луча, мы сформируем на водной глади это красивое, искаженное бегущей рябью отражение. Собственно, иными методами его трудно нарисовать правильно.
Но просто это только на бумаге. Алгоритмически идейно просто. Сложность в том, что небольшая область сильно искривленной ребристой зеркальной поверхности отражает в приблизительно одном направлении большой сектор пространства. И если мы, для одного пикселя, проведем один отраженный луч из точки зеркальной поверхности, в которую попал луч, соответствующий пикселю, то этот один отраженный луч слабо представит все множество объектов, отражения которых должны попасть в пиксель экрана.
Как видно, даже близко расположенные параллельные лучи при отражении от кривой поверхности, расходятся в разные стороны, из-за этого отраженные лучи будут разряженными и в отражении пропадут многие объекты.
Тут можно упомянуть хороший всем известный пример: отражение заходящего солнца в виде дорожки на морской поверхности с волнами. Так каждый объект, на самом деле, многократно отражается в волнах и формирует свою дорожку, они могут пересекаться.
Решение в рамках метода трассировки лучей просто и естественно — проводить множество лучей для одного пикселя. Тогда отражение получится более качественным и не будет «прыгать» при небольшом движении наблюдателя. Но, вполне понятно, что это потребует в десять раз большей вычислительной мощности, чтобы нарисовать картинку за такое же время.
Очевидно, методы трассировки лучей, которые, по сути, симулируют распространение света в модели линейной оптики, дают возможность получить хорошее приближение реального освещения сцены, нарисовать корректные отражения. Но рендеринг в реальном времени сложной сцены потребует колоссальных вычислительных ресурсов.
Далее мы рассмотрим примеры реализации вариаций метода трассировки лучей в реальном времени, они позволят оценить необходимую для высокого реализма мощность. Но можно заранее сказать, что она примерно в 100-1000 раз превосходит мощность современных настольных систем.