chapter 7:漫反射材料
文章翻译
现在我们有多个物体和基于每个像素的多束光线,我们可以制作一些看起来逼真的材料了,我们即将开始漫反射材料。有一个问题是我们是否可以混合和匹配形状和材料(因此我们可以给一个球体一种材料)或者如果把二者放在一起,几何形状和材料就紧密结合在一起(对于把几何和材料连在一起的程序对象来讲这是有用的).我将其分离——这在大多数渲染器是普遍的——但是注意其中的限制。
漫反射材质不会发出光线,只不过是呈现出其周围环境的颜色,但是他们会用自己内在的颜色来调节它。光线在漫反射表面的反射方向是随机的,因此,如果我们发射三条光线进入两个漫反射表面的缝隙中,他们将会有不同的随机行为。
这些光线也可能被吸收而非反射,表面颜色越黑暗,光线被吸收的可能性越大。(这就是为什么它是黑色的!)事实上,任何能够随机方向的算法都能产生看起来哑光的表面。其中一个最简单的方法实现了,证明了对于理想的漫反射材料来讲是十分正确的.(作为一个随性的黑客,我曾经实现了它并得到一个近乎在数学上达到理想状态的漫反射).
从一个与相交点正切的单位球体中随机选择一个点 s,并且从相交点 p 向随机点 s 发射一束光线,单位球体的中心点是 (p+N):
我们也需要一个方法来从中心在原点的单位球体中选择一个随机点,我们将使用平常来说最简单的算法:一种拒绝方法。首先,我们从一个x,y,z取值范围为-1~1的单位立方体中随机选取一个点,如果这个点在单位球体外,我们拒绝这个点并再次选取,一个 do/while 结构很适合这个:
得到图片如下:
注意球体下面的阴影,这张图片太黑了,然而我们的球体在光线的每次弹射仅吸收一半的能量,因此这是50%的反射器。如果你不能看见阴影,不用担心,我们现在修复它。这些球体应该看起来光鲜漂亮(在现实生活,一种浅灰色).原因是几乎所有图像浏览者都假设图片是 gamma 矫正过的,意味着0~1的取值在存储进一个字节前做过一些转变。这样做有很多好的理由,但是对我们来讲,我们只需要意识到它。为了做到近似,我们可以使用" gamma 2 ",这意味着我们将颜色提高 " 1/gamma "幂次,或者在我们简单案例中,仅是一个平方根:
这产生了一张浅灰色图片,正式我们想要的:
这里面也有一个细微的错误,一些反射光线击中了使他们反射的物体,不是在 t = 0 处,而是在 t = -0.0000001 或者 t = 0.00000001 处 或者 浮点近似球体相交处,因此我们要忽略非常接近于零的近似值:
这就消除了阴影粉刺的问题,通常是这样称呼的。
简单解释
前面求的光线与球体相交处的法线派上用场了,用处是求光线漫反射后的方向,步骤是这样的:
相交点处做一个正切的单位球体,在里面随机选择一点作为漫反射后的方向,我们可以将问题转换为,在原点处的单位圆处随机选择一点,用了拒绝点方法,我们用相交点+相交点处的单位法向量+选取的随机点就相当于得到正切处单位球体随机选取的点,用求出的点减去相交点就得到漫反射的方向向量