painter’s algorithm:后画的东西会覆盖到前画的东西。
一个直观的想法是先画远处的,后画近处的。但是有时候远近很难定义:
Z-Buffer
对每个像素有两个buffer:存储颜色和深度的buffer
对于相机来说:向z的负半轴方向看,离得越远,z值越小。这在讨论上是不方便的。将其更换为“距离”这个概念,总是正的,而且距离越远值越大。
算法执行流程:
先遍历每个三角形,再遍历三角形中的每个采样点,进行两个buffer的更新。
虽然是两层遍历,但是我们认为第二层循环次数是一个常数,所以是O(n)复杂度。
能够排序,怎么还能达到O(n)呢?因为我们其实不是进行排序操作,而是维护一个最小值,而不关系除了最小值之外的其他值的排序问题。
Shading
着色:the process of applying a material to an object.
着色不只是颜色,还有材质和明暗。
三种光:镜面反射、漫反射、来自环境的光照。
Shading is Local:局部着色
shading不是shadow
这里说了几个着色的关键点:
光照、光线反射点特征、观测点
何为Local?局部,即我们只考虑本物体而不考虑其他物体的影响,比如“阴影”
diffuse reflection
物体收到的光线强度和法线光线夹角有关
如上图:
- 正射:6条光线覆盖了单位平面
- 斜射:3条光线覆盖了单位平面,是一半
光线的散射:
随光线发散,半径增大,分摊到每个单位面积上的能量越来越少。以半径比的平方反比为速度衰减。
我们先来考虑L
L指的是一个点所接收到的光*漫反射系数
L与v无关:漫反射后在各个方向都是一样的
L与nl有关:越斜,面收到的光线越少。看后面的月球图。
L与漫反射系数有关:一个表面吸收的光、反射的光和表面本身的材质有关。如果规定了kd是一个向量,为三个值[r,g,b],三个值分别表示该表面吸收三色光的度量。