那些曾经的花儿
好静啊,我们的夜~

   常见的光照模型(无论是局部光照模型还是全局光照模型)基本上都是基于几何光学的,对于大尺寸几何体和表面粗糙度较大的物体来说,还可以达到逼真的效果。对于几何尺寸和表面粗糙度接近于可见光波长的物体来说,由于会产生衍射(Diffraction)现象,就必须要考虑到光的波动性了。Stam Jos在其论文《Diffraction Shaders》中对衍射模型做了非常细致的推导,感兴趣的同学不妨去啃一啃。在这里只做一个简单的介绍。
   根据惠更斯原理我们知道,介质中任一波面上的各点,都可以看作是发射子波的波源。这就是为什么水波穿过细缝时不是成射线状,而是呈球面状的原因。此外,费涅耳在研究光波衍射时提出:衍射场中各点的强度由各子波在该点的相干叠加决定,因此在不同的视线角度,看到的相干图样有所不同。有了这两个定理就可以展开介绍了。下面就是一个简单的示意图:
                                               
  其中L是光源方向,V是视线方向,光线照射到表面之后在表面产生无数的子波,将子波看作是新的光源,最后传递到眼中形成干涉条纹。干涉条纹产生的条件是:d*(sin@1-sin@2)为光线波长的整数倍,这样就会在眼点出产生极大值的光线叠加。
  使用shader实现Diffraction时的关键在于光程差的求解和形成干涉的波长的光线颜色的确定。在GPU Gems I中,前者是通过将光源和视点形成的半角矢量投影到顶点的切线空间获取的,而后者则是通过将颜色设定为波长的二次抛物线关系来计算的。下面就是使用这种方法,在添加了基于Cube Mapping的Reflection之后的CD 衍射效果图。
                         
   实际拿张光盘看了一下,发现有个问题,无论怎么运动,彩色衍射条纹始终是成直线型的,而实际的衍射条纹则会出现弯曲,原因我分析可能是在构建CD Mesh是,径向顶点的切线是一样的,这样产生的衍射颜色就一致的,如果对其中远端顶点的切线作同一个方向的随机扰动,估计可能会好一些。
   总结:原理很简单,实现起来也不困难,不过从Stam Jos发表了这篇文章之后,并没有引起很大的反响,搜了一下ACM的数据库,发现这方面的研究也不是很多,可能是实际应用的需求还不是很大吧。
 

posted on 2007-11-17 15:31  soaroc  阅读(718)  评论(1编辑  收藏  举报