Как реально совместить освещение Фонг с диэлектрическим отражением / передачей Френеля?
ОБНОВЛЕНИЕ: я ответил на мой собственный вопрос о том, какую модель освещения использовать, но теперь мне нужно знать, как рассчитать термины Френеля для отраженных и прошедших лучей.
У меня есть частично реализованный 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. Если я хочу получить дополнительную точность, как бы я рассчитал их в терминах моих уже определенных переменных?