86.1 光照模型
在考虑“间接光照”的情况下,间接光照可能来自撞击点上半球的任意方向,如下图所示:
86.2 镜面反射(Mirror Reflection)
一般情况,求解“式子86.2”的间接光照的反射模型是非常复杂的。但是,我们现在考虑的是特殊情况:镜面反射。
86.3 连续的镜面反射
如果场景中有多个“反射材质”的物体,镜面反射将会连续下去。如下图:
86.4 镜面反射的反射光线在场景中的各种情形
镜面反射的反射光线离开撞击点之后,在场景中可能遇到如下四种情形:
86.5 C++代码实现
86.6 测试图形
图形中包含两个物体:
1,上方的hand skeleton,非反射材质;
2,下方的绿色平面,反射材质。
接下来,我们主要是调节下方平面的反射材质的参数,来看看生成图形的效果。
直接光照参数,影响的是平面本身的效果。间接光照参数,影响的是平面反射的hand skeleton像的效果。
86.6.1 调节直接光照参数
平面的直接光照参数:ka=0.4;kd=0.8;cd(0.5,1,0.5);ks=0.5,exp=50;
平面的间接光照参数:kr=0.75;cr(1,1,1);
平面的直接光照参数:ka=0.4;kd=0.8;cd(0.5,1,0.5);ks=0.0,exp=50;
平面的间接光照参数:kr=0.75;cr(1,1,1);
(由于exp=50较大,所以高光部分的光线较少,所以关掉高光对图形整体的影响不明显)
平面的直接光照参数:ka=0.4;kd=0.0;cd(0.5,1,0.5);ks=0.0,exp=50;
平面的间接光照参数:kr=0.75;cr(1,1,1);
(再关掉“漫射光”)
平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.0,exp=50;
平面的间接光照参数:kr=0.75;cr(1,1,1);
(再关掉“环境光”)
平面的直接光照参数:ka=0.0;kd=0.8;cd(0.5,1,0.5);ks=0.0,exp=50;
平面的间接光照参数:kr=0.75;cr(1,1,1);
(只开“漫射光”)
平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.5,exp=50;
平面的间接光照参数:kr=0.75;cr(1,1,1);
(只开“高光”。由于exp=50较大,所以高光部分的光线较少。开与不开,好像没什么影响)
平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.5,exp=1;
平面的间接光照参数:kr=0.75;cr(1,1,1);
(之前的高光部分太少,看不出效果。接下来,将高光部分调大,看看效果)
(注意:下方平面是绿色的,之所以看到的是“灰白色”,是因为看到的只是高光)
86.6.2 调节间接光照参数
关掉了所有的直接光照参数,所以看不到平面本身。
平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.0,exp=50;
平面的间接光照参数:kr=0.75;cr(0.5,1,0.5);
平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.0,exp=50;
平面的间接光照参数:kr=0.75;cr(0.0,0.0,1.0);
平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.0,exp=50;
平面的间接光照参数:kr=0.75;cr(0.5,0.5,1.0);
86.7 其他说明
完整的代码,参考:http://download.csdn.net/detail/libing_zeng/9780925
Referrance
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.
86.8 补充测试图形
交换下方平面和上方hand skeleton的材质。
Hand Skeleton:
平面的直接光照参数:ka=0.4;kd=0.8;cd(0.5,1,0.5);ks=0.5,exp=50;
平面的间接光照参数:kr=0.75;cr(1,1,1);
Plane:
ka=0.4;kd=0.8;cd(1.0,0.2,0.0);ks=0.5,exp=50;