87.1 建立模型
接下来就是采样啦!
之前,我们遇到过的采样一般都是对撞击点处的上半球面进行采样,比如:
这是因为cos分布对应的夹角是光线和法向量的夹角。
但是,我们这里对应的夹角是光线和镜面反射光线r的夹角。所以,我们需要采样的半球面是这个这样子:
具体采样过程可以参考“ 问题七十一:环境光遮蔽(AmbientOcclusion)”:
http://blog.csdn.net/libing_zeng/article/details/57639455
(只需要在建立正交基时,将原来的n换成r)
但是,有个问题:
有一部分采样点会落在物体表面以下。
针对这个问题的处理方式是:将这部分落在物体表面以下的采样点沿着表面翻转到表面以上:
在程序中只需做如下处理:
87.2 C++代码实现
87.3 测试图形
87.3.1 测试图形(1)
相关代码:
输出图形:
单像素点采样次数为1时:
单像素点采样次数为256时:
87.3.2 测试图形(2)
相关代码:
输出图形:
接下来测试是:改变“模糊指数”exp(其他所有参数如上方测试程序所示,并保持不变),对比输出图形的效果。
exp=10:
exp=100:
exp=1000:
exp=10000:
exp=100000:
exp=1000000:
对比之前的镜面反射模型的图形(之前图形是600*600,现在的图形是400*600):(当“模糊指数exp”足够大时,高光反射模型就非常接近镜面反射模型了。)
87.4 其他说明
完整的代码,参考:http://download.csdn.net/detail/libing_zeng/9781791
Referrance
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.