本专栏内容整理了GAMES101的计算机图形学课程的主要内容,作为我学习计算机图形学的一份复习备份或叫做笔记。内容中如有错误,或有其他建议,欢迎大家指出。
漫反射是指当有一根光线打到到物体表面后向各个方向均匀反射的现像。这种向四面八方的反射使得物体表面看起来不光滑,从而产生了物体的哑光外观。
那么我们要如何用程序将漫反射的现像模拟出来呢?
生活中当光线照射到一个单色立方体的各个面上,每个面面呈现出来的明暗是不一样的。这是为什么呢?
我们一起看下图中的例子,假如说光线是离散的,比如图中的光是由六根光线组成的。每根光线带有固定的能量。那么我们发现,当表面跟光线的入射方向是垂直的,那么这个面可以接受到这束光的所有能量。当我们将物体表面旋转了一定角度,这时候物体表面就只接受到了三根光线的能量,这个时候,这个物体表面就应该暗一些。
也就是说:一个物体表面的单位面积内,接受到的光线的方向向量L,跟物体表面法向量N的夹角就跟这个面的明暗有关系。
光线传播
根据能量守恒定理,假设在光线传播过程中,能量没有衰减。那么,随着传播的距离越远,那么在这个距离半径处的圆表面积会加大,但是这个表面积承载的能量不变,所以单位面积内的能量就会减少。也就是说明:一个物体,离光源位置越远,那么,在这个物体的单位面积上能接收到的能量就越小。
可以分析出:光源传播出来能到达的光与物体到点光源的距离成平方反比,再根据shading-point表面法向量与入射光线夹角向量我们可以知道shading-point可以接受多少比例的光线。用能到达的光量和能接收到的比例相乘我们就可以得到一个shading-point的明暗度应该是多少。
在实际情况中还需要考虑物体表面会吸收多少能量,反射的能量 = 接受到的-吸收的。自然界中,不同的颜色会吸收不同的能量,我们同样可以模拟这样一个属性:Kd 。当Kd为1的时候表示吸收多少能量就反射多少能量(表现为光源颜色)。当我们把Kd用三维向量表示,表示为三通道颜色的rgb。那么我们就可定义这个shading-point的颜色了。
且因为漫反射是向空间中均匀反射,也就是说,你从任何一个角度去观察,shading-point展现的漫反射颜色应该都是一样的。也就是说漫反射项跟观测向量V没有任何关系。我们从图中右边的漫反射关系函数上也能看出来。向量V没有参与计算。只有光线向量和平面法向量参与了计算。
下图是颜色系数Kd对于漫反射结果的影响,从左到右,Kd越来越大