3

更新:我回答了我自己关于使用什么照明模型的问题,但现在我需要知道如何计算反射和透射光线的菲涅耳项。

我有一个部分实现的 C++ 光线追踪器。现在,带有阴影光线的 Phong 光照效果很好。我选择不使用单一颜色加上标量环境/漫反射/标量系数的实体;这三个系数每个都有 RGB 分量,所以我可以实现这样的材料。另一方面,灯光具有单一的 RGB 颜色以及标量漫反射和镜面反射强度。还有一个 RGB 环境光。

在这一点上,我还可以实现反射或透射所有光的完全介电实体,反射光与折射光的比例由菲涅耳方程确定。但是,如何将反射和折射的颜色与 Phong 颜色真实地结合起来?我想要有轻微反光的彩色塑料、抛光金色、完美的镜面或玻璃球、彩色玻璃、正面透明但边缘呈绿色的玻璃板,等等。我打算给每个实体添加 RGB 反射率和透射率系数,并让实体设计者确保环境+漫反射+镜面反射+反射率+透射率在合理范围内,但这似乎是任意的。有没有基于物理的方法?

4

1 回答 1

3

我自己在.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

这很密集,实际上有一些拼写错误(如Kxand 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,因此对镜面高光和反射光线使用相同的系数是很自然的。

还有一件事我不明白。如果我不想打扰菲涅耳项,我可以将FlFr和设置Ft为 1。但是,如果我想要更高的精度,我将如何根据我已经定义的变量来计算它们?

于 2012-03-28T05:32:39.707 回答