我自己在.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
and 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 镜面反射是一种用于反射光源的注重性能的 hack,因此对镜面高光和反射光线使用相同的系数是很自然的。
还有一件事我不明白。如果我不想打扰菲涅耳项,我可以将Fl
、Fr
和设置Ft
为 1。但是,如果我想要更高的精度,我将如何根据我已经定义的变量来计算它们?