1.modeling
如下图,在点镜面点P,有入射光线l,入射光线r , 法线 n,且三线共面。根据向量知识,有r = al + bn, 左右同时乘以向量 n,有 .
对上公式,左右同时点乘 向量n 的垂直向量,可以得到 a = -1, 综上可知
因为镜面反射的反射光线主要集中在r周围,此时,r沿w0 的衰减满足
phong 模型中, 光亮度,进而
,综合有
对于直线光照,所有光线平行,所以有
加上ambient,diffuse,specular 三种反射,就有
Implementation:
RGBColor
Phong::shade(ShadeRec& sr) {
Vector3D wo = -sr.ray.d;
RGBColor L = ambient_brdf->rho(sr, wo) * sr.w.ambient_ptr->L(sr);
int num_lights = sr.w.lights.size();
for (int j = 0; j < num_lights; j++) {
Vector3D wi = sr.w.lights[j]->get_direction(sr);
float ndotwi = sr.normal * wi;
if (ndotwi > 0.0) {
bool in_shadow = false;
if (sr.w.lights[j]->casts_shadows()) {
Ray shadowRay(sr.hit_point, wi);
in_shadow = sr.w.lights[j]->in_shadow(shadowRay, sr);
}
if (!in_shadow)
L += ( diffuse_brdf->f(sr, wo, wi)
+ specular_brdf->f(sr, wo, wi)) * sr.w.lights[j]->L(sr) * ndotwi;
}
}
return (L);
}