着色/Shading
着色:两件事情,一是引入明暗的不同,二是引入颜色的不同
这节课里把shader定义成对不同的物体应用不同的材质这一过程,不同的材质肯定和光线的相互作用有不同的方法
A Simple Shading Model(Blinn-Phong Reflectance Model)
布林冯反射模型
某个光源在右上的图片
镜面高光,漫反射,环境光
定义一些东西:n法线,v观测方向,l光照方向。物体表面的相关属性,有多亮shininess,颜色color
目前说的着色都是局部的,只考虑自己,不考虑是否在阴影内,不考虑其他物体的存在,不考虑光线是否会被别的地方的物体挡住。所以没有阴影
漫反射/diffuse
漫反射:一个光线打到物体的某个点时,光线会被均匀的反射到不同的方向上去
当物体表面的朝向和物体有一定夹角时,得到的明暗是不一样的
光是一种能量,考虑一个shading point接送了多少能量,就考虑周围一个单位面积接受了多少能量,单位面积始终是不变的
接受到的能量和光照方向与法线方向的夹角的余弦值是成正比的。当两个方向平行时接受了所有的能量,当几乎垂直时单位面积几乎接受不到多少光
光是一种点光源时,我们认为在任何一个时刻,光的能量一定集中在一个球壳上。根据能量守恒,当光传播的越来越远时,球壳越来越大,每个点上的能量越小。
假设球壳和点光源的距离是1时,我们定义光的强度是
I
I
I(光的各种物理量,在这里定义用强度其实不合理,这里先暂时这样解释),当传播到距离为
r
r
r时,光的强度是
I
r
2
{I}\over{r^2}
r2I
球的表面积是
4
π
r
2
4πr^2
4πr2, 根据能量守恒
4
π
I
=
4
π
r
2
×
?
4πI = 4πr^2\times ?
4πI=4πr2×?
因此单位面积接受到的光的能量,和光的传播距离是成平方反比的
假设一个点光源,距离shading point的距离是
r
r
r,到达点的能量是
I
r
2
{I}\over{r^2}
r2I,接受多少取决于余弦(两个单位向量点乘
n
⋅
l
n{\cdot}l
n⋅l),可以求得最终能看到多少能量,即物体的明暗
注意,当两个向量点乘为负时,在这里没有物理意义,这是光线从物体下面打到点上,对于反射没有意义。
对于点来说,有颜色是因为反射出了不吸收的能量。
不同的点有不同的吸收率,因此形成不同的颜色,
定义一个系数
k
d
k_d
kd表示了多少能量被吸收,为1时完全不吸收能量,为0时吸收所有能量。当把这个数量表示成一个三通道的向量rgb,就可以表示这个shading point的颜色
漫反射和观察角度
v
v
v完全没有关系
漫反射虽然是光被均匀的反射到四面八方各个方向,但不代表看到的结果完全是平的,而是跟各个位置的朝向有关系,只不过意味着,不管从哪个位置看某个点,如果光源位置不变,如果物体位置不变,看到的结果亮度是一样的
镜面反射/specular
比较光滑的物体,反射方向都非常接近镜面反射方向
R
R
R,观察方向
v
v
v和镜面反射接近时,能看到高光,其他时候看不到高光
当观察方向
v
v
v和镜面反射方向
R
R
R接近时,其实就是法线向量
n
n
n和半程向量
h
h
h很接近
l
+
v
l+v
l+v之后根据平行四边形法则,一定是角平分线方向,再做归一化获得
h
h
h
这样为了衡量能否看到高光,只需判断半程向量和法线是否接近
两个向量点乘
n
⋅
h
n{\cdot}h
n⋅h,接近1离得近,接近0离得远,反向不考虑
通常情况下,高光都认为是白的,所以一般高光的镜面反射系数
k
s
k _s
ks认为是白色
实际镜面反射项也要考虑多少能量被吸收
n
n
n和
l
l
l的点乘,但布林冯模型是经验模型,主要关注的是能否看见高光,把能量吸收简化掉了
直接用
R
⋅
v
R{\cdot}v
R⋅v判断镜面反射是冯反射模型,布林冯模型是个改进,因为半程向量
h
h
h更好算,反射向量
R
R
R不好算
点乘后需要加上右上角的指数
p
p
p,因为向量之间的余弦虽然能判断向量是否接近,但是容忍度太高了。例如当相隔45°的时候,已经离得较远,但余弦值仍然较大。如果直接用夹角余弦值生成算高光,会生成一个非常亮的高光
一般情况下,布林冯模型里,指数
p
p
p取值在100-200之间,基本在3°,5°之外就看不到高光
k
s
k_s
ks系数从上往下增大,表示越亮,
p
p
p指数从左往右增大,高光越来越小
环境光照/ambient
物体有些地方不直接被光源照到,但不是完全暗的,因为有很多光线弹射很多次后从四面八方照射到物体上
因此假设任何一个点,接收到来自环境的光永远都是相同的,强度叫
I
a
I_a
Ia,
k
a
k_a
ka为环境光的颜色系数
环境光和实际光照方向
l
l
l无关,和观察方向
v
v
v也无关。环境光其实是一个常数。其实就是某一个物体任何一个地方它都有一个常数的颜色
布林冯模型这里的环境光这只是个假设,事实上要精确计算环境光要通过复杂的全局光照处理