Сравнение модели затенение по Фонгу и анизотропной модели Варда

Сравнение модели затенение по Фонгу и анизотропной модели Варда

Затенение объектов

Для реалистичного рендера 3D объектов необходимо рассчитать отражение света. Хорошо освещённые части объекта будут иметь блики, а неосвещенные будут в тени.

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

В этой статье будут использоваться модели по Фонгу и Варду.

Моделирование расчёта освещения объекта обычно представляет из себя расчёт трёх составляющих: фоновой (ambient), рассеянной (diffusion) и бликовой (specular). Ниже на изображении представлены три компонента и результат их сложения.

 фоновой (ambient), рассеянной (diffusion) и бликовой (specular) составляющие

Модель отражения по Фонгу

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

Для понимания модели освещения по Фонгу рассмотрим расчёт каждой из трёх компонентов отдельно.

  • Фоновая (ambient) компонента является самой простой. Она зависит только от фоновой интенсивности источника света и коэффициента фонового освещения объекта. Физический смысл компоненты - это свет, который переотражается от многих объектов и в результате освещает объект, который не находится под прямыми солнечными лучами. И правда, у вас же с утра в квартире светло, даже если все окна выходят на запад и прямой солнечный свет в них не попадает. Квартира освещается отражённым светом от земли или от других домов.

 Освещение комнаты фоновым освещением

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

 Векторы, используемые для расчёта освещения

    * N - нормаль. L - вектор, направленный на источник света. V - вектор, направленный на наблюдателя. R - отражённый луч света.

  • Бликовая (specular) или отражённая компонента зависит от позиции наблюдателя. Физический смысл этой компоненты - это свет, который отражается от объекта и "попадает" прямо в наблюдателя. Если вы смотрите в зеркало, то вы видите своё отражение, также когда солнечный свет отражается от зеркала и попадает вам в глаза, вы видите отражённый свет. Поверхность объекта, на которой находится блик, освещена лучше всех остальных. Бликовая компонента зависит от угла между отражённым лучём (R) и лучём, направленным на наблюдателя (V). Чем угол меньше, тем блик ярче.

Я не буду приводить формулы расчёта, т.к. вы их сможете найти в шейдерах в приведённом примере.

Ниже вы можете увидеть сферу и тор, освещённые одним источником света с использованием модели освещения по Фонгу.

 Векторы, используемые для расчёта освещения

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

Анизотропная и изотропная модель

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

 Блик на стальной кастрюле

Подробнее о теории этого явления можно прочитать в других статьях. Например, в "Использование двухлучевой функции отражательной способности (ДФОС) для моделирования освещения".

Анизотропная модель Варда

В анизатропной модели Варда для учёта формы блика введено два коэффициента, которые отвечают за форму блика по оси X и Y. Формула выглядит так:

 Формула Варда

Коэффициенты αx и αy используются для настройки анизатропных свойств. Ниже вы видите сферу и тор, отрисованные с помощью этого метода:

 Сфера и тор с использованием модели Варда

Но в данном примере коэффициенты одинаковые для всего объекта, а что если для каждого пикселя будут свои коэффициенты и как это будет выглядеть?

Анизотропная модель Варда с картой коэффициентов

Для задания коэффициентов для каждого пикселя изображений я использовал текстуру. Компоненты R и G использовались в качестве них. Правда, их пришлось немного преобразовать для получения более-менее красивого результата. Ниже представлен пример карты коэффициентов:

 Карта для анизотропной модели Варда

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

 Пример рендера анизотропной модели Варда с картой коэффициентов

Используя этот метод, необходимо подобрать хорошую карту коэффициентов. Если у кого-то это получится лучше, чем у меня, то пришлите мне её на почту :) admin@unick-soft.ru

Пример

Вы можете изучить пример, созданный для данной статьи. Найдёте вы его тут GitHub/UnickSoft. Нажимая на пробел, вы можете останавливать вращение источника света, а нажимая на клавиши 1 или 2, вы смените объект.

Выводы

В статье описано сравнение методов по Фонгу и метода Варда. Фонг - довольно простая модель, которая подходит в большинстве случаев. Анизотропная модель, в свою очередь, поможет вам в отрисовке реалистичных материалов, но требует большего труда для подбора правильных коэффициентов.

Теги: OpenGL