Трассировка фотонов через призму (2D / 3D)

Автор задания:
Алексей Игнатенко

Введение

Цель задания – получение практических навыков работы с цветом и светом, машинным представлением цвета, а также получение представления о синтезе фотореалистичных изображений с помощью трассировки фотонов.

Требуется визуализировать (в двумерной проекции) эффект дисперсии света при прохождении через призму для заданного спектра источника света.

Описание задания

Задание состоит их двух подзадач:

  1. Симуляция прохождения света через призму с заданными характеристиками материала и получения эффекта дисперсии в виде рисунка (радуги) на плоскости. Задача решается в проекции на плоскость.
  2. Преобразование результата из спектра в цвет для заданного цветового пространства. В обязательной части заданным пространством является sRGB.

Пример выполненного задания:


Рисунок 1: Пример выполненного задания.

Подзадача 1: Симуляция прохождения света через призму

Сцена состоит из трех объектов: площадной источник света, призма и пластинка-получатель (Рис. 1). Для упрощения задачи сцена рассчитывается в проекции на плоскость, перпендикулярную плоскости источника света и пластинки-получателя.


Рисунок 2: Объекты сцены.

Характеристики объектов:

Источник света

Источник света задается положением (x, y) левого края и длиной. Источник является параллельным, т.е. вся его энергия направлена строго вдоль нормали к плоскости поверхности. Мощность источника задается спектральным распределением энергии Ф в видимом диапазоне (как минимум 360-780 нм c некоторым шагом).

Призма

Призма всегда расположена так, как показано на рисунке – основание слева перпендикулярно поверхности источника света. Призма характеризуется положением верхнего левого угла, длиной основания и углом при вершине

Считается, что призма реализует идеальное преломление, вся энергия проходит через призму без потерь.

Коэффициент преломления материала призмы задается для каждой длины волны (обычно от 1.3 до 1.7 от видимых длинных до коротких). Можно считать, что призма находится в вакууме (коэффициент преломления 1).

Коэффициенты преломления допускается задавать с помощью линейной интерполяции между значениями на краях видимой области (хотя для реальных материалов зависимость гораздо сложнее). Пример на рисунке 1 был получен для следующих значений: 360нм – 1.3, 830нм – 1.2. Для более точного задания коэффициентов преломления можно воспользоваться эмпирической формулой Селлмейра (Sellmeier equation).

Пластинка-получатель

Пластинка-получатель задается положением левого края и длиной (хотя допускается считать, что она бесконечная).

Материал получателя – идеально диффузный (т.е. равномерно рассеивает всю энергию, которую получает).

Сутью подзадания является расчет излучения каждой точки пластинки в сторону воображаемого наблюдателя (положение наблюдателя не важно, т.к. пластинка рассеивает свет одинаково во все стороны). Это предлагается реализовать с помощью упрощенного (на двумерный случай) алгоритма трассировки фотонов.

Ниже приводится краткое описание предлагаемого варианта алгоритма.

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

Испускание фотона из источника света

Предлагается реализовать фотон как следующую структуру данных:

  • Длина волны, соответствующая фотону
  • Мощность энергии фотона (Вт)
  • Луч, по которому летит фотон

Для получения равномерной светимости по всей площади источника можно разбить его на N равных частей и испустить K фотонов для каждой из них, где K – число разбиений спектра, с которым мы проводим расчет (например, для трех разбиений, т.е. для RGB, необходимо будет выпустить три фотона для каждой длины волны из каждой точки). В этом случае мощность каждого фотона будет равна . Направление всех исходящих фотонов должно быть одинаковое (для заданного параллельного источника света).

Можно реализовать и другой вариант – каждый фотон обладает единичной энергией, но количество выпущенных фотонов пропорционально мощности источника на данной частоте. Возможны также варианты, основанные на статистическом подходе к генерации фотонов.

Прохождение фотонов через призму

Для корректной реализации прохождения фотона через призму необходимо изменять его траекторию при входе и при выходе из призмы, реализуя идеальное преломление.

Углы преломления можно рассчитать с помощью закона Снелла: , где – угол между нормалью к поверхности и направлением входящего луча, а – аналогичный угол для выходящего луча. , – индексы рефракции соответствующих материалов.


Рисунок 3: преломление лучей при прохождении через призму

Создание фотонной карты и вычисления излучения

Для вычисления излучения пластинки-получателя необходимо сохранять все фотоны, попадающие на пластинку после прохождения через призму или напрямую от источника.

Для получения значения излучения L точки p на пластинке-получателе необходимо просуммировать энергии всех фотонов в некоторой (малой) окрестности радиусом r.

, где - энергия p-го фотона. Радиус r может эмпирически подбираться в зависимости от количества фотонов или равняться фиксированному числу на Ваше усмотрение. Обратите внимание, что задается энергетическим спектром.

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

Далее нужно преобразовать полученный спектр в цвет (это задача решается в подзадаче 2).

Подзадача 2: Преобразование из спектра в цвет

Для преобразования из спектра в цвет необходимо воспользоваться весовыми кривыми для стандартного наблюдателя CIE 1931 (см. материалы для выполнения задания) и матрицей преобразования в конкретную систему RGB.

Для преобразования из спектра в RGB необходимо проделать следующие вычисления:

  1. Преобразование из спектра в XYZ
  2. Преобразование из XYZ в RGB
  3. Коррекция яркости

Преобразование из спектра
в XYZ выполняется следующим образом:



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

Преобразование из XYZ в RGB производится с помощью матрицы 3x3 и последующей гамма-коррекции (гамма-коррекция обычно является частью спецификации конкретного RGB-пространства). Данные о различных RGB-пространствах можно найти в материалах для выполнения задания. Для реализации обязательной части нужно реализовать преобразование в пространство sRGB.

Этап коррекции яркости нужен для того, чтобы растянуть или сжать диапазон яркостей до стандартного [0, 255] (аналог адаптации человеческого глаза). Простейшим (но не самым лучшим) алгоритмом коррекции является деление значений всех цветов на максимальную яркость, полученную после преобразования в цвет.

Обязательная часть

Обязательная часть задания включает в себя реализацию обоих подзаданий с выполнением следующих требований:

  • Фиксированное положение источника света и объектов (источник света обязательно протяженный)
  • Загрузка спектра источника света в формате CSV (описание формата см. в разделе «Материалы для выполнения задания»)
  • Преобразование в sRGB.
  • Возможность просчета изображения для 3, 5, 20, 50 выборок из спектра.

Дополнительная часть

Дополнительно к обязательной части можно реализовать:

  • Визуализация лучей, проходящих через призму
  • Графический интерфейс для задания положения и параметров (размера, угла) призмы
  • Графический интерфейс для задания коэффициентов преломления призмы.
  • Графический интерфейс для задания положения и размера источника света.
  • Возможность задания количества выборок спектра с помощью графического интерфейса.
  • Возможность выбора пространства RGB (Adobe RGB, NTSC RGB, sRGB)
  • Визуализация спектра излучения на пластинке-получателе по клику мышкой (визуализация в виде кривой)
  • Визуализация загруженного спектра источника света (визуализация в виде кривой).
  • Реализация более сложных многогранных призм
  • Реализация задания в трехмерном пространстве с визуализацией на OpenGL или DirectX (+10-15 баллов) (в этом случае 2D-вариант можно не реализовывать – он засчитывается автоматически).

Материалы для выполнения задания

Дополнительные материалы и ссылки:

Требования к программе

В минимальном варианте программа должна позволять загружать файл с источником света, визуализировать источник света, призму, пластинку-получатель. Изображение распределения цвета пластинки-получателя лучше рисовать высотой не менее чем в 20 пикселей.

Оценка

Компонент Оценка
Обязательная часть задания 16 баллов
Визуализация лучей, проходящих через призму 1 балл
Задание положения и параметров (размера, угла) призмы +1-2 балла
Задание коэффициентов преломления призмы +1-4 балла
Задание положения и размера источника света +1-2 балла
Задание количества выборок спектра +2 балл
Возможность выбора пространства RGB +2 балл
Визуализация спектра излучения на пластинке-получателе +1 балл
Визуализация загруженного спектра источника света +1 балл
Реализация более сложных многогранных призм +2-4 баллов
Реализация задания в трехмерном пространстве +5-10 баллов

Примечание: удобство интерфейса оценивается проверяющими субъективно.

Оформление работы

Работа должна быть оформлена в виде zip-архива. О содержимом архива и оформлении readme.txt-файла можно узнать здесь.

Результаты работы

Результаты работы будут опубликованы на сайте в течение недели после окончания срока сдачи задания.

© Лаборатория компьютерной графики при ВМиК МГУ