模糊镜面反射
传统的光线跟踪算法中一般使用的是标准的向量反射公式来模拟规则镜面反射。然而现实世界中却经常不是这样,因为材质表面不可能完全光滑,任何表面细微的凹凸不平都可能导致反射图像的不清晰,如下左图的金属表面呈现出明显的细微凹凸,因此映射于其上的反射图案也会因此变得模糊(下右图)
不仅镜面反射能够出现模拟,折射也会出现这种情况:
一种较简单的处理一般镜面模糊反射的方法是使用分布式光线跟踪算法(distribution ray tracing),该算法又称随机光线跟踪(stochastic ray tracing),它在处理每一被跟踪光线时,在光线与景物表面的焦点处不仅朝其镜面反射方向和规则折射方向发射光线,并且依据该处的光照性质朝其反射和折射方向附近的立体角内亦发射采样光线。如果取Phong镜面反射分布函数作为表面反射和折射的分布函数,则分布式光线跟踪所对应的光照模型为:
可以预见的是,当场景内非理想漫反射物体较多,而采样次数线性增大时,计算量会呈指数级上升(这是因为物体间的相互反射或折射作用造成的)。
分布式光线跟踪还能模拟半影,景深,运动模糊等效果,同时能很好地处理由于二次光线导致的走样现象,下图租为传统光线跟踪图样(上)和分布式光线跟踪模拟的模糊反射(下)的对比:
模拟参数为:采样次数40次,采样偏移范围为单位化向量各个分项±0.025f,分布函数为均匀分布....,所以效果实际上是各向同性的模糊,若想模拟更为复杂的模糊效果,需要更加复杂的分布函数定义。
各向异性反射模糊
各向同性的反射(折射)模糊看起来就像物体表面被涂上了一层油渍,而现实中却不总是这样,比如粗糙金属表面,CD光盘表面等,各向异性反射模糊就可以来表现这些效果。为了对物体的反射方向进行控制,我们首先需要得到物体的局部坐标系,可以利用顶点的纹理U,V值求出顶点切向量,得到顶点的切向空间坐标系(这个坐标系在法线贴图中也有用到),然后再这个坐标系下对反射方向作定义。比如我们可以令模糊采样范围规定在该点切向量(正负)方向上,也可以允许其在切向量(正负)方向偏移一个α角度内。基于此,我实现了一个简单的各向异性反射模糊,下图是我用这种方法模拟金属薄板的反射效果(似乎并不太理想)
最后,为了对比这两种方法,我对同一场景作了数次渲染,下面是有代表性的几幅结果:
(参考图) (各项同性模糊,参数0.08f)
(各向异性模糊,参数0.125f) (各向异性模糊,参数0.6f)
注:本文参考了http://www.neilblevins.com/cg_education/aniso_ref/aniso_ref.htm
本文部分图片来自网络