71.0 引言(Introduction)
一开始被“Ambient Occlusion”这个名字唬到了,然后又是什么“cosine distribution”和“samples on hemisphere”,感觉神乎其神。
后来,通过程序生成了相关图形之后,才恍然觉得和之前在“问题十九:怎么模拟ray tracing中漫射球体的颜色(diffuse materials)”基本是同一回事。
http://blog.csdn.net/libing_zeng/article/details/54428306
只是,之前还没有“环境光”的概念,根本没有意识到只考虑了环境光。
当时对撞击点的着色大概是这样:
在撞击点处作以单位法向量,然后以单位法向量的另一端为球心作一个单位球面;
然后在球面上随机取一点来确定入射光线的方向;
然后判断该“入射光线”是否撞击到其他物体,每撞击到一次,光线强度进行相应的衰减。
我们接下来正儿八经学习的“环境光遮蔽”,也基本是这个方法:
光线撞击物体,得到撞击点;
然后,对撞击点处的单位上半球面进行采样得到很多个采样点;
然后,撞击点分别和这“很多个采样点”组合得到“很多条阴影光线”;
若阴影光线撞击到其他物体,说明这条阴影光线对应的环境光线被其他物体挡住了,若阴影光线没有撞击到其他物体,说明这条阴影光线对应的环境光线能够顺利到达撞击点;
然后,根据顺利到达撞击点的阴影光线的条数来给撞击点进行着色。
71.1 建模(Modeling)
之前,我们认为来自各个方向的环境光的强度是一样的,不考虑环境光可能被其他物体遮挡住。对应生成的图形,则是扁平的。例如:
但是实际上,只要环境中的物体个数大于一个,物体接受的环境光就会被其他物体遮挡。如下图示意: