一、遮挡(Visibility / occlusion)
我们如何在计算机上画出图形的遮挡关系。一种方法是画家算法--指从远到近,不断用近处的物体覆盖掉远处的物体,但是利用画家算法时会遇到,当远近差不多的几个面的绘画的先后顺序会导致图像的差异,例如:
为了解决这样的问题,人们发明了深度缓存(Z-Buffer)
1.1 深度缓存(Z-Buffer)
这个算法的本质思想就是,生成一个渲染图和一个深度缓存图,一个像素一个像素的进行比对z轴最大的,但是,为了简化计算,我们认为,z轴值永远为正,这样的话,z值最小的就是离我们最近的。例如:
以多个三角形的遮挡为例,在一开始,我们认为像素的距离都是无限远的,我们对每个三角形进行遍历,记录像素在三角形内的z值,如果遇到更小的z值,则覆盖原有的z值,并且把这个像素画进去:
结合MSAA反走样的操作,还可以对采样点而不是像素进行深度测试
二、着色(Shading)
着色的定义:引入明暗关系和颜色关系的过程。我们的课程中定义为,对不同的物体应用不同的材质的过程为着色
对于同一物体上的相同颜色的部分,我们看见的却不一定是同一颜色
2.1 一个简单的着色模型--Blinn-Phong Reflectance Model
先定义一些概念:
v为观测方向,l为光源方向,n为表面法线方向,对于这个着色点本身,定义一些相关的量,比如颜色,光亮度等
注:着色具有局部性,不考虑光线投射导致的阴影,而只看重物体本身的变化:
2.1.1 漫反射
有一束光线打在物体表面,然后向四面八方反射就是漫反射
当物体偏转时,打在物体某一表面的光线会减少,从而导致亮度变暗
根据Lambert‘s cosine law,物体表面接受到的能量与光源方向和法线方向的余弦成正比
这里的 I / r^2 代表光线传播到着色点的能量,max(0,n·l)代表着色点接受的能量,因为n·l的负值无意义,所以这里取0和n·l的最大值,kd代表着色点接受的能量有多少被吸收,Ld表示经过漫反射之后的光线能量