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

 

ЧТО ЭТО ТАКОЕ?

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

 

 

КАК ЭТО РАБОТАЕТ?

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

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

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

f(a, b, c) =>L/2 - max(|x - a|, |y - b|, |z - c|), где a, b, c – положение куба в пространстве, а  L – длина его стороны. Кстати, в интернете есть множество таких функций для самых разных геометрических фигур. Далее выпускаем луч на длину, возвращаемую этой функцией,и делаем то, что описано ниже.  

  1. Если пересечение обнаружено, то красим очередной пиксель в один цвет, иначе – в другой. Таким образом мы получаем визуальное представление нашего куба на экране.Правда, пока что все будет выглядеть двуцветно и скучно.

 

 

  1. Чтобы сделать картинку поприятнее и добиться эффекта затененности, нам понадобится источник света. В данном примере его будет достаточно представить в какой-то точке пространства простой сферой, с которой нам также нужно будет искать пересечение.
    P.S. Если кто-то забыл уравнение сферы из курса школьной геометрии, то я напомню: (x - a) ^ 2 + (y - b) ^ 2 + (z - c) ^ 2 = R ^ 2. Эту функцию также используем для расчета пересечения луча аналогично предыдущей.
  2. Общая идея такова: луч выпускается из камеры, летит до пересечения с кубом. Если пересечение обнаружено, то мы вспоминаем, что угол падения равен углу отражения (из курса физики). Соответственно мы можем высчитать направление луча, то есть куда он полетит после столкновения. Получив этот вектор, мы определяем, попадает ли отраженный луч в источник света. Если попадает, то красим текущий пиксель в более яркий цвет (яркость можно определять как расстояние отражаемого луча до источника света), если не попадает, то в более темный. И вот мы получили то, что на профессиональном языке называется shading. Теперь наш кубик не однотонный, а затененный, что делает его более красивым.
  3. Чтобы добиться эффекта тени, можно использовать все тот же отраженный луч. Для того чтобы получить тень, мы выпускаем еще один луч в обратном направлении вектора отражения, и, если этот луч пересекается с другими объектами в пространстве, понижаем контрастность тех пикселей и делаем их чуть более темными.

 

 

  1. Последнее, что осталось – это сделать куб зеркальным. Для этого также вспоминаем из физики, что зеркальная поверхность – эта та, которая практически не поглощает свет, а отражает. Для того, чтобы добиться этого эффекта, все, что нам нужно – это продлить жизнь лучу. Теперь, когда луч будет пересекаться кубом, мы будем создавать новый из точки пересечения и выпускать в обратном направлении (по сути, делать то же, что и в предыдущих пунктах). Далее повторяем этот шаг несколько раз и получаем эффект зеркала! Единственное, что нужно – это ограничить количество таких повторений, скажем до 10. Это позволит значительно снизить нагрузку на компьютер, но при этом немного понизит качество отражения.

 

 

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

 

ГДЕ ПРИМЕНЯЕТСЯ?

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

 

 

В последнее время raytracingстали применять и в играх, правда требовательность игры тогда значительно возрастает. Но все же, те, кто обладают очень мощными комплектующими точно заценили технологию в Metro Exodus, Cyberpunk или Quake 2 RTX. Да что уж говорить, достаточно просто вбить в YouTube "Minecraft RTX", и вы все поймете сами.

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



Олег Топорков

Популярні статті

Читати далі