Вычисление затенения через прозрачную поверхность - PullRequest
8 голосов
/ 03 января 2011

В трассировке лучей я хочу рассчитать затенение для точки, где мой луч попал. Я «рисую» линии для всех источников света и проверяю, заблокированы ли они объектами или нет. Если они не заблокированы, то я рассчитываю интенсивность освещения в соответствии с их интенсивностью и степенью между «ударным лучом» и нормалью поверхности.

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

Есть ли быстрый и хороший способ приблизить цвет, или я должен просто принять цвет поверхности как светлый цвет и его прозрачность как интенсивность?

Ответы [ 2 ]

3 голосов
/ 04 января 2011

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

+     *     +
 +    *    +
  +   *   +
   +  *  +
 ----------
|    +*+   |
|   + * +  |
|  +  *  + |
 ----------
 +    *    +
      *
      *
   -------

Это предполагает, конечно,, что в материале нет преломления.

Теперь, если вы хотите расширить свой лучевой трассировщик на что-то более продвинутое, например, трассировку пути, то вам нужно будет рассмотреть свет, отражающийся от полупрозрачного объекта.и попадает в ваш последний объект, но для трассировщика лучей вам не нужно беспокоиться об этом.

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

Если вы хотите по-настоящему продвинуться в том, что такое светкогда он находится в объекте, вам нужно будет перейти к подповерхностному рассеянию (причина, по которой молоко в стакане не похоже на белое твердое вещество, и почему людей так трудно моделировать в CGI).

РЕДАКТИРОВАТЬ: Явление, о котором вы упоминаете, когда свет бесконечно подпрыгивает туда-сюда и использует множество вычислений, - это то, как ведет себя настоящий свет.Усовершенствованные рендеры в настоящее время не могут интегрировать все эти световые компоненты, и поэтому вместо этого случайным образом выбирают распределения света.Чем больше образцов будет взято, тем ближе изображение будет выглядеть реалистичным, и тем ближе будет к действительному значению интеграция света.Это называется рендерингом Монте-Карло.Трассировка пути, двунаправленная трассировка и светопропускание в мегаполисе - все это алгоритмы Монте-Карло, которые пытаются полностью имитировать светопередачу.Каждый алгоритм при наличии достаточного количества времени будет сходиться к одному и тому же конечному изображению, однако некоторые из них более эффективны, чем другие.(См. отслеживание пути в Википедии. В нижней части статьи изображение лучше, чем то, которое я пытался нарисовать).

0 голосов
/ 04 января 2011

Если вам нужны поверхности, которые могут выполнять как обычное затенение, так и прозрачность, самое простое - игнорировать регулярное затенение для теневых лучей: для целей освещения используйте только атрибуты фильтрации прозрачных поверхностей.Это позволяет избежать потенциально бесконечных вычислений освещения, которые вы описали.

Обратите внимание, что существует хороший способ аппроксимации деревьев бесконечных лучей, который называется «Русская рулетка»: когда любая ветвь дерева становится слишком незначительной, сделайте случайный выбор относительно того, чтобы обрезать его.Ветви обрезаются с вероятностью P и дают нулевой результат (они «мертвы» и не требуют вычисления).Выжившие ветви («победители») умножают свой вклад на 1/(1-P), так что полученное приближение в среднем является правильным.

Русская рулетка - это метод Монте-Карло;Вы можете изучить трассировку лучей Монте-Карло и другие методы глобального освещения .

...