====光线追踪入门====
光线追踪的基本思路是模拟光从光源发出后到达观察者前的过程。
从图一来看,光线可以直接到达观察者,也可以经过反射或折射再到达观察者。
我们只要跟踪这些光线,再根据某个光照模型就可以计算出我们想要的图像。
图一 光线到达观察者的可能的方式
从图一也不难想到,我们感兴趣的仅仅是能够到达观察者的那些光线,
没有到达观察者的光线不会对最终结果产生影响。因此,我们将从观察者来发出光线,
由于光路是可逆的,这点完全没有问题。那么,我们如何射出这些光线呢?
因为最终结果是一张二维的图片,我们感兴趣的只是这张二维图片上每个像素点的颜色值。
所以我们可以通过观察者(抽象为一个点)和每个像素点来生成一条射线,如图二所示,
然后通过跟踪这条射线同场景中物体的交互情况来确定该像素点的颜色值。
图二 通过观察者和屏幕像素点来确定光线
在示例程序中,我们只考虑最简单的情况。即一旦这条光线与场景中的某个物体相交,
就根据交点处的情况和光源的位置等信息计算出该像素点的颜色值。当然
这么搞就会有很多很多问题,首先遮挡就不对,也不会有阴影、反射、折射
等等效果。而且由于场景设置不合理及光照模型比较简单,有时会遇到比较
怪异的现象,比如图三中的黑环。
图三 奇怪的黑环,因Mach banding所致
源代码:
raytracer.zip
参考资料:
flipcode上的raytracer系列文章
Mach Bands
Discussion