Если данный материал покажется Вам не актуальным, не уникальным или, более того, бессмысленным, прошу обратить Ваше внимание на то, что данная статья является лишь второй из цепочки связанного рассказа про различные аспекты трассировки лучей и рендеринг трёхмерных изображений. Я считаю необходимым, со своей стороны, подвести читателя к теме полноценно и сохраняя нить повествования. Если Вас заинтересовала конкретная тема из курса статей, Вы всегда можете перейти к конкретной публикации в профиле С уважением, автор перевода Предыдущая глава Феномен из прошлой статьи, описанный Ибн аль-Хайсамом, объясняет, почему мы видим объекты. На основе его наблюдений можно сделать два интересных замечания: во-первых, без света мы ничего не можем видеть, а во-вторых, без объектов в нашем окружении мы не можем видеть свет. Если бы мы путешествовали в межгалактическом пространстве, именно это обычно и происходило бы. Если вокруг нас нет материи, мы не можем видеть ничего, кроме темноты, даже несмотря на то, что фотоны потенциально движутся через это пространство (конечно, если бы фотоны были, они должны были бы откуда-то взяться. И если бы вы посмотрели на них прямо, если бы они попали вам в глаза, вы бы увидели изображение объекта, от которого они отразились или испустились). Если мы пытаемся смоделировать процесс взаимодействия света с объектом на сгенерированном компьютером изображении, то существует еще одно физическое явление, о котором нам необходимо знать. По сравнению с общим количеством лучей, отраженных объектом, лишь немногие из них когда-либо достигнут поверхности нашего глаза. Вот пример. Представьте, что мы создали источник света, который испускает только один фотон за раз. Теперь давайте рассмотрим, что происходит с этим фотоном. Он испускается источником света и движется по прямой траектории до тех пор, пока не достигнет поверхности нашего объекта. Игнорируя поглощение фотона, мы можем предположить, что фотон отражается в случайном направлении. Если фотоны попадают на поверхность нашего глаза, мы "видим" точку, от которой фотон отразился (рис. 1). Выше вы утверждаете, что "каждая точка на освещенной области или объекте излучает (отражает) световые лучи во всех направлениях". Разве это не противоречит понятию "случайный"? Объяснение того, почему свет отражается во всех возможных направлениях, не относится к теме данного конкретного урока (для получения полного объяснения можно обратиться к уроку о взаимодействии света и материи). Однако, коротко отвечу на ваш вопрос: и да, и нет. Конечно, в природе реальный фотон отражается реальной поверхностью в определенном направлении (и, следовательно, не случайном), определяемом топологией геометрии и направлением попадания фотона в точку пересечения. Поверхность рассеянного объекта кажется гладкой, если мы смотрим на нее своими глазами. Хотя, если мы посмотрим на него под микроскопом, то поймем, что микроструктура могла бы быть более сложной и гладкой. Изображение слева представляет собой фотографию бумаги с различными масштабами увеличения. Фотоны настолько малы, что микроструктуры и формы отражают их на поверхности объекта. Предположим, луч света попадает на поверхность этого рассеянного объекта. В этом случае фотоны в объеме пучка будут попадать в очень разные части микроструктуры и, следовательно, будут отражаться во множестве различных направлений. Так много, что мы говорим: "во всех возможных направлениях". Предположим, мы хотим смоделировать это взаимодействие между фотонами и микроструктурой. В этом случае мы посылаем лучи в случайных направлениях, что, с точки зрения статистики, примерно то же самое, как если бы они отражались во всех возможных направлениях. Иногда структура материала на макроуровне организована в виде узоров, которые могут заставить поверхность объекта отражать свет в определенных направлениях. Это описывается как анизотропное отражение и будет подробно объяснено на уроке, посвященном взаимодействию света и материалов. Макроструктура материала также может вызывать необычные визуальные эффекты, такие как переливчатость, которую мы можем наблюдать на крыльях бабочек.  Теперь мы можем взглянуть на ситуацию с точки зрения компьютерной графики. Сначала мы заменяем наши глаза плоскостью изображения, состоящей из пикселей. В этом случае испускаемые фотоны попадут в один из множества пикселей на плоскости изображения, увеличивая яркость в этой точке до значения, превышающего ноль. Этот процесс повторяется несколько раз до тех пор, пока не будут скорректированы все пиксели, создавая сгенерированное компьютером изображение. Этот метод называется прямой трассировкой лучей, потому что мы отслеживаем путь фотона от источника света к наблюдателю. Однако видите ли вы потенциальную проблему в таком подходе? Проблема заключается в следующем: в нашем примере мы предположили, что отраженный фотон всегда пересекает поверхность глаза. На самом деле лучи отражаются во всех возможных направлениях, каждое из которых имеет очень, очень малую вероятность попадания в глаз. Нам пришлось бы отбросить миллионы фотонов от источника света, чтобы найти только один фотон, который попал бы в глаз. Именно так это работает в природе, поскольку бесчисленные фотоны распространяются во всех направлениях со скоростью света. В компьютерном мире моделирование взаимодействия множества фотонов с объектами в сцене не является практичным решением по причинам, которые мы сейчас объясним. Итак, вы можете подумать: "Нужно ли нам посылать фотоны в случайных направлениях? Поскольку мы знаем положение глаза, почему бы просто не послать фотон в этом направлении и не посмотреть, через какой пиксель изображения он проходит, если таковой имеется?" Это одна из возможных оптимизаций. Однако мы можем использовать этот метод только для определенных типов материалов. В следующем уроке, посвященном взаимодействию света и материи, мы объясним, что направленность не является существенной для рассеянных поверхностей. Это связано с тем, что фотон, попадающий на рассеянную поверхность, может быть отражен в любом направлении внутри полусферы, центрированной вокруг нормали в точке контакта. Однако предположим, что поверхность является зеркальной и не обладает диффузными характеристиками. В этом случае луч может быть отражен только в точном направлении, в зеркальном направлении (то, что мы научимся вычислять позже). Для такого типа поверхности мы не можем решить искусственно изменить направление фотона, если предполагается, что он должен следовать зеркальному направлению, а это означает, что это решение могло бы быть более удовлетворительным. Является ли глаз только точечным рецептором или у него есть площадь поверхности? Даже если принимающая поверхность очень мала, она все равно имеет площадь и, следовательно, больше точки. Если область приема больше точки, то поверхность, несомненно, получит больше, чем просто 1 из миллиардов лучей. Читатель прав. Глаз - это не точечный рецептор, а поверхностный рецептор, подобный пленке или ПЗС-матрице в вашей камере. Поскольку этот урок является всего лишь введением в алгоритм трассировки лучей, эта тема нуждается в подробном объяснении. Как камеры, так и человеческий глаз имеют линзу, которая фокусирует отраженные световые лучи на поверхность позади себя. Если бы линза имела очень малый радиус (что технически не так), свет, отраженный от объекта, мог бы исходить только с одного направления. Именно так работают камеры-обскуры. Мы поговорим о них на уроке, посвященном камерам. Даже если мы решим использовать этот метод со сценой, состоящей только из рассеянных объектов, нам все равно понадобится помощь. Мы можем визуализировать выброс фотонов из источника света в сцену, как если бы мы распыляли световые лучи (или мелкие частицы краски) на поверхность объекта. Если распыление будет недостаточно плотным, некоторые участки будут освещены неравномерно. Представьте, что вы пытаетесь раскрасить чайник, рисуя точки белым фломастером на чистом листе бумаги (учитывайте каждый фотон dota). Как показано на рисунке ниже, только несколько фотонов пересекаются с объектом teapot, оставляя много незакрытых областей. По мере добавления точек плотность фотонов увеличивается до тех пор, пока чайник не будет "почти" полностью покрыт фотонами, что делает объект более легко узнаваемым. Но съемка 1000 фотонов или даже в X раз больше никогда не гарантирует, что поверхность нашего объекта будет покрыта фотонами. Это существенный недостаток этой техники. Другими словами, нам пришлось бы позволить программе работать до тех пор, пока мы не решим, что она распылила достаточное количество фотонов на поверхность объекта, чтобы получить его точное представление. Это подразумевает, что мы должны наблюдать за изображением во время его рендеринга, чтобы решить, когда остановить приложение. В производственной среде это невозможно. Как мы увидим, самой дорогостоящей задачей в трассировщике лучей является поиск пересечений геометрии лучей. Создание большого количества фотонов из источника света не является проблемой, но найти все их встречи в пределах сцены было бы непомерно дорого. Вывод: Прямая трассировка лучей (или трассировка света, потому что мы снимаем лучи от источника света) делает технически возможным моделирование того, как свет распространяется в природе, на компьютере. Однако, как уже обсуждалось, этот метод мог бы быть более эффективным и практичным. В основополагающей статье под названием "Улучшенная модель освещения для затененного дисплея", опубликованной в 1980 году, Тернер Уиттед (один из первых исследователей компьютерной графики) писал: При очевидном подходе к трассировке лучей световые лучи, исходящие от источника, прослеживаются по своим траекториям до тех пор, пока они не попадут на зрителя. Поскольку лишь немногие из них дойдут до зрителя, такой подход мог бы быть лучше. Во втором подходе, предложенном Аппелем, лучи прослеживаются в противоположном направлении, от зрителя к объектам сцены. Теперь мы рассмотрим другой режим, о котором говорит Уиттед. Вместо того чтобы прослеживать лучи от источника света к рецептору (такому как наш глаз), мы прослеживаем лучи в обратном направлении от рецептора к объектам. Поскольку это направление является обратным тому, что происходит в природе, оно называется обратной трассировкой лучей или трассировкой глаз, потому что мы снимаем лучи с позиции глаз (рис. 2). Этот метод обеспечивает удобное решение проблемы прямой трассировки лучей. Поскольку наше моделирование не может быть таким быстрым и совершенным, как в природе, мы должны пойти на компромисс и проследить луч от глаза до сцены. Если луч попадает на объект, мы определяем, сколько света он получает, отбрасывая другой луч (называемый лучом света или тенью) из точки попадания в источник света сцены. Иногда этот "световой луч" загораживается другим объектом со сцены, что означает, что наша первоначальная точка попадания находится в тени; она не получает никакого освещения от источника света. По этой причине мы называем эти лучи не световыми, а теневыми лучами. В литературе по компьютерной графике первый луч, который мы посылаем из глаза (или камеры) в сцену, называется первичным лучом, лучом видимости или лучом камеры. В этом уроке мы использовали прямую трассировку для описания ситуации, когда лучи отбрасываются источником света, в отличие от обратной трассировки, когда лучи снимаются камерой. Однако некоторые авторы используют эти термины наоборот. Прямая трассировка означает съемку лучей с камеры, поскольку это наиболее распространенный метод трассировки траекторий, используемый в компьютерной графике. Чтобы избежать путаницы, вы также можете использовать термины "свет" и "отслеживание глаз", которые являются более четкими. Эти термины чаще используются в контексте двунаправленного отслеживания траектории (см. раздел "перемещение света"). В компьютерной графике концепция съемки лучей либо от источника света, либо от глаза называется трассировкой траектории. Также можно использовать термин трассировка лучей, но идея трассировки траектории предполагает, что этот метод создания сгенерированных компьютером изображений основан на следовании пути от источника света к камере (или наоборот). Делая это физически реалистичным способом, мы можем легко смоделировать оптические эффекты, такие как каустика или отражение света другой поверхностью в сцене (непрямое освещение). Эти темы будут обсуждаться на других уроках. Следующая глава  Python, js, web-разработка