Прежде всего
Если данный материал покажется Вам не актуальным, не уникальным или, более того, бессмысленным, прошу обратить Ваше внимание на то, что данная статья является лишь второй из цепочки связанного рассказа про различные аспекты трассировки лучей и рендеринг трёхмерных изображений. Я считаю необходимым, со своей стороны, подвести читателя к теме полноценно и сохраняя нить повествования.
Если Вас заинтересовала конкретная тема из курса статей, Вы всегда можете перейти к конкретной публикации в профиле
С уважением, автор перевода
Феномен из прошлой статьи, описанный Ибн аль-Хайсамом, объясняет, почему мы видим объекты. На основе его наблюдений можно сделать два интересных замечания: во-первых, без света мы ничего не можем видеть, а во-вторых, без объектов в нашем окружении мы не можем видеть свет. Если бы мы путешествовали в межгалактическом пространстве, именно это обычно и происходило бы. Если вокруг нас нет материи, мы не можем видеть ничего, кроме темноты, даже несмотря на то, что фотоны потенциально движутся через это пространство (конечно, если бы фотоны были, они должны были бы откуда-то взяться. И если бы вы посмотрели на них прямо, если бы они попали вам в глаза, вы бы увидели изображение объекта, от которого они отразились или испустились).
Прямая трассировка
Если мы пытаемся смоделировать процесс взаимодействия света с объектом на сгенерированном компьютером изображении, то существует еще одно физическое явление, о котором нам необходимо знать. По сравнению с общим количеством лучей, отраженных объектом, лишь немногие из них когда-либо достигнут поверхности нашего глаза. Вот пример. Представьте, что мы создали источник света, который испускает только один фотон за раз. Теперь давайте рассмотрим, что происходит с этим фотоном. Он испускается источником света и движется по прямой траектории до тех пор, пока не достигнет поверхности нашего объекта. Игнорируя поглощение фотона, мы можем предположить, что фотон отражается в случайном направлении. Если фотоны попадают на поверхность нашего глаза, мы "видим" точку, от которой фотон отразился (рис. 1).
Так "случайно" или "во всех направлениях"?
Выше вы утверждаете, что "каждая точка на освещенной области или объекте излучает (отражает) световые лучи во всех направлениях". Разве это не противоречит понятию "случайный"?
Объяснение того, почему свет отражается во всех возможных направлениях, не относится к теме данного конкретного урока (для получения полного объяснения можно обратиться к уроку о взаимодействии света и материи). Однако, коротко отвечу на ваш вопрос: и да, и нет. Конечно, в природе реальный фотон отражается реальной поверхностью в определенном направлении (и, следовательно, не случайном), определяемом топологией геометрии и направлением попадания фотона в точку пересечения. Поверхность рассеянного объекта кажется гладкой, если мы смотрим на нее своими глазами. Хотя, если мы посмотрим на него под микроскопом, то поймем, что микроструктура могла бы быть более сложной и гладкой. Изображение слева представляет собой фотографию бумаги с различными масштабами увеличения. Фотоны настолько малы, что микроструктуры и формы отражают их на поверхности объекта. Предположим, луч света попадает на поверхность этого рассеянного объекта. В этом случае фотоны в объеме пучка будут попадать в очень разные части микроструктуры и, следовательно, будут отражаться во множестве различных направлений. Так много, что мы говорим: "во всех возможных направлениях". Предположим, мы хотим смоделировать это взаимодействие между фотонами и микроструктурой. В этом случае мы посылаем лучи в случайных направлениях, что, с точки зрения статистики, примерно то же самое, как если бы они отражались во всех возможных направлениях.
Иногда структура материала на макроуровне организована в виде узоров, которые могут заставить поверхность объекта отражать свет в определенных направлениях. Это описывается как анизотропное отражение и будет подробно объяснено на уроке, посвященном взаимодействию света и материалов. Макроструктура материала также может вызывать необычные визуальные эффекты, такие как переливчатость, которую мы можем наблюдать на крыльях бабочек.
Теперь мы можем взглянуть на ситуацию с точки зрения компьютерной графики. Сначала мы заменяем наши глаза плоскостью изображения, состоящей из пикселей. В этом случае испускаемые фотоны попадут в один из множества пикселей на плоскости изображения, увеличивая яркость в этой точке до значения, превышающего ноль. Этот процесс повторяется несколько раз до тех пор, пока не будут скорректированы все пиксели, создавая сгенерированное компьютером изображение. Этот метод называется прямой трассировкой лучей, потому что мы отслеживаем путь фотона от источника света к наблюдателю.
Однако видите ли вы потенциальную проблему в таком подходе?
Проблема заключается в следующем: в нашем примере мы предположили, что отраженный фотон всегда пересекает поверхность глаза. На самом деле лучи отражаются во всех возможных направлениях, каждое из которых имеет очень, очень малую вероятность попадания в глаз. Нам пришлось бы отбросить миллионы фотонов от источника света, чтобы найти только один фотон, который попал бы в глаз. Именно так это работает в природе, поскольку бесчисленные фотоны распространяются во всех направлениях со скоростью света. В компьютерном мире моделирование взаимодействия множества фотонов с объектами в сцене не является практичным решением по причинам, которые мы сейчас объясним.
Итак, вы можете подумать: "Нужно ли нам посылать фотоны в случайных направлениях? Поскольку мы знаем положение глаза, почему бы просто не послать фотон в этом направлении и не посмотреть, через какой пиксель изображения он проходит, если таковой имеется?" Это одна из возможных оптимизаций. Однако мы можем использовать этот метод только для определенных типов материалов. В следующем уроке, посвященном взаимодействию света и материи, мы объясним, что направленность не является существенной для рассеянных поверхностей. Это связано с тем, что фотон, попадающий на рассеянную поверхность, может быть отражен в любом направлении внутри полусферы, центрированной вокруг нормали в точке контакта. Однако предположим, что поверхность является зеркальной и не обладает диффузными характеристиками. В этом случае луч может быть отражен только в точном направлении, в зеркальном направлении (то, что мы научимся вычислять позже). Для такого типа поверхности мы не можем решить искусственно изменить направление фотона, если предполагается, что он должен следовать зеркальному направлению, а это означает, что это решение могло бы быть более удовлетворительным.
Разве глаз - точечный рецептор?
Является ли глаз только точечным рецептором или у него есть площадь поверхности? Даже если принимающая поверхность очень мала, она все равно имеет площадь и, следовательно, больше точки. Если область приема больше точки, то поверхность, несомненно, получит больше, чем просто 1 из миллиардов лучей.
Читатель прав. Глаз - это не точечный рецептор, а поверхностный рецептор, подобный пленке или ПЗС-матрице в вашей камере. Поскольку этот урок является всего лишь введением в алгоритм трассировки лучей, эта тема нуждается в подробном объяснении. Как камеры, так и человеческий глаз имеют линзу, которая фокусирует отраженные световые лучи на поверхность позади себя. Если бы линза имела очень малый радиус (что технически не так), свет, отраженный от объекта, мог бы исходить только с одного направления. Именно так работают камеры-обскуры. Мы поговорим о них на уроке, посвященном камерам.
Даже если мы решим использовать этот метод со сценой, состоящей только из рассеянных объектов, нам все равно понадобится помощь. Мы можем визуализировать выброс фотонов из источника света в сцену, как если бы мы распыляли световые лучи (или мелкие частицы краски) на поверхность объекта. Если распыление будет недостаточно плотным, некоторые участки будут освещены неравномерно.
Представьте, что вы пытаетесь раскрасить чайник, рисуя точки белым фломастером на чистом листе бумаги (учитывайте каждый фотон dota). Как показано на рисунке ниже, только несколько фотонов пересекаются с объектом teapot, оставляя много незакрытых областей. По мере добавления точек плотность фотонов увеличивается до тех пор, пока чайник не будет "почти" полностью покрыт фотонами, что делает объект более легко узнаваемым.
Но съемка 1000 фотонов или даже в X раз больше никогда не гарантирует, что поверхность нашего объекта будет покрыта фотонами. Это существенный недостаток этой техники. Другими словами, нам пришлось бы позволить программе работать до тех пор, пока мы не решим, что она распылила достаточное количество фотонов на поверхность объекта, чтобы получить его точное представление. Это подразумевает, что мы должны наблюдать за изображением во время его рендеринга, чтобы решить, когда остановить приложение. В производственной среде это невозможно. Как мы увидим, самой дорогостоящей задачей в трассировщике лучей является поиск пересечений геометрии лучей. Создание большого количества фотонов из источника света не является проблемой, но найти все их встречи в пределах сцены было бы непомерно дорого.
Вывод: Прямая трассировка лучей (или трассировка света, потому что мы снимаем лучи от источника света) делает технически возможным моделирование того, как свет распространяется в природе, на компьютере. Однако, как уже обсуждалось, этот метод мог бы быть более эффективным и практичным. В основополагающей статье под названием "Улучшенная модель освещения для затененного дисплея", опубликованной в 1980 году, Тернер Уиттед (один из первых исследователей компьютерной графики) писал:
При очевидном подходе к трассировке лучей световые лучи, исходящие от источника, прослеживаются по своим траекториям до тех пор, пока они не попадут на зрителя. Поскольку лишь немногие из них дойдут до зрителя, такой подход мог бы быть лучше. Во втором подходе, предложенном Аппелем, лучи прослеживаются в противоположном направлении, от зрителя к объектам сцены.
Теперь мы рассмотрим другой режим, о котором говорит Уиттед.
Обратная трассировка
Вместо того чтобы прослеживать лучи от источника света к рецептору (такому как наш глаз), мы прослеживаем лучи в обратном направлении от рецептора к объектам. Поскольку это направление является обратным тому, что происходит в природе, оно называется обратной трассировкой лучей или трассировкой глаз, потому что мы снимаем лучи с позиции глаз (рис. 2). Этот метод обеспечивает удобное решение проблемы прямой трассировки лучей. Поскольку наше моделирование не может быть таким быстрым и совершенным, как в природе, мы должны пойти на компромисс и проследить луч от глаза до сцены. Если луч попадает на объект, мы определяем, сколько света он получает, отбрасывая другой луч (называемый лучом света или тенью) из точки попадания в источник света сцены. Иногда этот "световой луч" загораживается другим объектом со сцены, что означает, что наша первоначальная точка попадания находится в тени; она не получает никакого освещения от источника света. По этой причине мы называем эти лучи не световыми, а теневыми лучами. В литературе по компьютерной графике первый луч, который мы посылаем из глаза (или камеры) в сцену, называется первичным лучом, лучом видимости или лучом камеры.
Уточнение
В этом уроке мы использовали прямую трассировку для описания ситуации, когда лучи отбрасываются источником света, в отличие от обратной трассировки, когда лучи снимаются камерой. Однако некоторые авторы используют эти термины наоборот. Прямая трассировка означает съемку лучей с камеры, поскольку это наиболее распространенный метод трассировки траекторий, используемый в компьютерной графике. Чтобы избежать путаницы, вы также можете использовать термины "свет" и "отслеживание глаз", которые являются более четкими. Эти термины чаще используются в контексте двунаправленного отслеживания траектории (см. раздел "перемещение света").
Вывод
В компьютерной графике концепция съемки лучей либо от источника света, либо от глаза называется трассировкой траектории. Также можно использовать термин трассировка лучей, но идея трассировки траектории предполагает, что этот метод создания сгенерированных компьютером изображений основан на следовании пути от источника света к камере (или наоборот). Делая это физически реалистичным способом, мы можем легко смоделировать оптические эффекты, такие как каустика или отражение света другой поверхностью в сцене (непрямое освещение). Эти темы будут обсуждаться на других уроках.
Следующая глава
Комментарии (9)
Rustam0
28.09.2023 12:38Кстати, косвенно этот феномен еще был описан в теории относительности. Очень интересно
IvanNoskov Автор
28.09.2023 12:38В первой главе этого цикла статей как раз разбираются общие понятия формирования изображения, там даже почти только одна физика, хоть и на очень примитивном уровне, для ознакомлением с понятиями:)
strvv
хорошо описано, в принципе этот же базис в применении программ на "с" для dos окружения был написан Шикиним и Боресковым, ещё в 90-е года.
IvanNoskov Автор
Да, согласен. Меня лично часто поражают и вдохновляют истории создания различных сложных алгоритмов в столь бородатые времена, что программирование тогда и сейчас - совсем разные вещи. История, например, разработки движка Wolfenstein 3D сподвигла меня к нескольким бессонным ночам за написанием несложного рендера начистом си. Вообще часто удивляешься, на что люди готовы ради покорения собственного интереса и любопытства
gev
как раз году, этак в 95м, у меня был курсач на эту тему по машграфике =), тоже на с писал
IvanNoskov Автор
Звучит очень интересно. Мне вот приходится изучать эти темы самому, в формате хобби, из открытых источников, было бы интересно узнать как это преподаётся
gev
Рэйтрайсинг у нас никак не преподавался. Были афинные преобразования, методы отсечения скрытых и граней, проекции различные, нормали и прочие начала. Мне была интересна 3д тема и я добрался до обратной трассировки. Литературу откопал тогда в белгородской научной библиотеке. Издание уже не вспомню какое. Том был 70х годов. в конце была вклека на нескольких мелованых глянцевых страницах с изображениями отрендеренными. Аквариум кпуглый с рыбками и тп. Было настольно реалистично, что сказать что я офигел – ничего не сказать. Картинки подстегнули только больше, ну и только появившийся 3дс 4й еще под ДОС тоже!
IvanNoskov Автор
Спасибо Вам за интересный рассказ, о подобных штуках только читал и смотрел в ретроспективах!
yamabusi
Если только самый конец 70х,вторая половина.
Есть такой отличный канал VintageCG,там история кг отлично прослеживается визуально,весьма рекомендую.
https://youtube.com@VintageCGG?si=W5kkpC1iQ-E8Ioum
Сам с детства болею темой,я правда не программист,больше процедурка в Houdini,но шейдера писал под старые ещё офлайн рендера,теорию тоже неплохо было знать,какой-нить Renderman(Reyes тогда ещё),привет Pixar и Эд Катмулл.А так в плане софта это же не ДОС,а никсы-Silicon Graphics,NeXT с Power Animator(родитель Maya),Softimage(гори в аду убивший её Autodesk),Lightwave3d под Amiga вроде вообще.Потом портировали это и под Винду.Но у нас на постсоветах конечно тогда ДОС.