Как реально совместить освещение Фонг с диэлектрическим отражением / передачей Френеля?

ОБНОВЛЕНИЕ: я ответил на мой собственный вопрос о том, какую модель освещения использовать, но теперь мне нужно знать, как рассчитать термины Френеля для отраженных и прошедших лучей.

У меня есть частично реализованный C++ ray tracer. Прямо сейчас освещение Фонг теневыми лучами работает нормально. Я решил не иметь сущностей с одним цветом плюс скалярные коэффициенты рассеяния / рассеяния / скаляра; каждый из трех коэффициентов имеет компоненты RGB, поэтому я могу реализовать такие материалы. Свет, с другой стороны, имеет один цвет RGB плюс скалярные диффузные и зеркальные интенсивности. Там также один RGB окружающий свет.

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

1 ответ

Я нашел подходящую модель освещения в документации для файлов.mtl:

color = KaIa
+ Kd { SUM j=1..ls, (N*Lj)Ij }
+ Ks ({ SUM j=1..ls, ((H*Hj)^Ns)Ij Fr(Lj*Hj,Ks,Ns)Ij} + 
Fr(N*V,Ks,Ns)Ir})
+ (1.0 - Kx)Ft (N*V,(1.0-Ks),Ns)TfIt

Это плотный и на самом деле имеет некоторые опечатки (как Kx а также Ft), поэтому я исправил это:

I = Ka * Ia
+ Kd * [sum for each light: (N . L) * Il]
+ Ks * [sum for each light: ((R . V) ^ Ps) * Fl * Il]
+ Ks * Fr * Ir
+ Kt * (1 - Ks) * Ft * It

I := surface point's color
V := ray direction
P := surface point
N := surface normal
L := light's position - P
R := L - 2 * (N . L) * P
Ka := surface material's ambient coefficient
Kd := surface material's diffuse coefficient
Ks := surface material's specular coefficient
Ps := surface material's shininess
Kt := surface material's transmission coefficient
Ia := ambient light color
Il := light's color
Ir := reflected ray's color
It := transmitted ray's color
Fl := light's Fresnel coefficient
Fr := reflected Fresnel coefficient
Ft := transmitted Fresnel coefficient

Эта модель имеет смысл для меня, особенно после прочтения Lighting 101 - зеркальное отражение от Phong - это хакерская производительность для отражения источников света, поэтому естественно использовать один и тот же коэффициент для зеркальных бликов и отраженных лучей.

Есть еще одна вещь, которую я не понимаю. Если я не хочу беспокоиться о терминах Френеля, я могу установить Fl, Fr, а также Ft 1. Если я хочу получить дополнительную точность, как бы я рассчитал их в терминах моих уже определенных переменных?

Другие вопросы по тегам