如何真实地将Phong照明与菲涅耳介质反射/透射相结合?

时间:2012-03-27 16:04:06

标签: c++ raytracing phong fresnel

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

我有部分实现的C ++光线跟踪器。现在Phong照明与阴影射线工作正常。我选择不使用单色加上标量环境/漫反射/标量系数的实体;这三个系数都有RGB分量,所以我可以实现像these这样的材料。另一方面,灯具有单一RGB颜色加上标量漫反射和镜面反射强度。还有一个RGB环境光。

此时我还可以实现完全反射或透射所有光的介电实体,其中反射到折射光的比例由菲涅耳方程确定。但是,如何将反射和折射颜色与Phong颜色真实地结合起来?我希望有略带反光的彩色塑料,抛光金,完美的镜面或玻璃球,彩色玻璃,透明正面但边缘是绿色的玻璃窗等等。我计划为每个实体添加RGB反射率和透射率系数,让实体设计师确保环境+漫反射+镜面+反射+透射率位于合理的范围内,但这似乎是随意的。有没有以物理为基础的方式?

1 个答案:

答案 0 :(得分:3)

我在documentation for .mtl files中找到了合适的照明模型:

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

这是密集的,实际上有一些拼写错误(如KxFt),所以我更正了它:

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镜面反射是一种用于反射光源的具有表现意识的黑客,所以对于镜面高光和反射光线使用相同的系数是很自然的。 / p>

还有一件事我不理解。如果我不想打扰菲涅耳条款,我可以设置FlFr和{{但是,如果我想要更高的准确度,我将如何根据已定义的变量计算它们?