Я нашел подходящую модель освещения в документации для файлов .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
Эта модель имеет для меня смысл, особенно после прочтения Освещение 101 - Зеркальное отражение Фонга - это хак, ориентированный на производительность, для отражающих источников света,поэтому естественно использовать один и тот же коэффициент для зеркальных бликов и отраженных лучей.
Есть еще одна вещь, которую я не понимаю. Если я не хочу беспокоиться о терминах Френеля, яможно установить Fl
, Fr
и Ft
на 1. Однако если я хочу получить дополнительную точность, как бы я рассчитал их в терминах моих уже определенных переменных?