目录
深度缓存 Z-buffer
光栅成像时,我们怎么处理场景中间物体相互叠加的情况呢?
深度信息
我们知道场景里面的物体都是由三角形构成的,每一个三角形在最后成像时会占据很多个像素, 对于每一个三角形,三角形可以覆盖到的每一个像素投影到三角形上所走的距离就是深度信息
所以每次我们把距离像素最近的那一个物体的这个像素渲染出来就行了,使用深度信息寻找距离这个像素(采样点)最近的物体
Z-buffer算法
Z-buffer算法就是在渲染每一个图的时候都在更新每一个像素的深度信息,使这个像素始终记录着最浅的深度信息,保证接下来显现的是最近的物体的像素
生成一张图片的时候,我们往往同时进行两个事情
- 一个是渲染图片的颜色
- 同时我们还要更新每一个像素(采样点)的深度信息,记录最近的
怎么维护?首先我们保证得到了每一个三角形对于每一个采样点的深度信息:
- 就是先初始每一个像素深度为正无穷
- 在光栅开始时,遍历每一个三角形和每一个三角形的所有区域
- 如果这个区域距离像素更近,就更新这个像素的深度数组,同时渲染的颜色改为这个区域的颜色
- 如果比记录最近的远,就什么都不做
两个三角形类模拟一下这个过程,其中三角形的每一个区域的深度信息都已知:
最后生成的深度二维数组zbuffer[ ][ ]如果绘制成一张图片就是下图右边,深度大的白色, 进的是黑色,在我们深度二维数组更新完毕后,左边的图其实也就生成好了的,是同步进行的,这样再送这张图上屏幕,就没有卡顿了(双缓冲原理)
最后,光栅化就可以显示正常覆盖的图片了
Shading 着色
进入着色前,我们学了什么?
首先我们有相机和物体,然后通过第一节的变换我们可以将相机移到原点,并且始终看向的是-z方向,同时一起变换物体,把物体使用投影变换投影到(-1 , 1)的区域内,在使用第二节光栅化和深度缓冲的知识将物体投影成屏幕上的像素,投影时就是进行采样,进行MSAA抗锯齿
所以现在我们需要知道每一个像素的颜色是什么,这个颜色对于光源来说,我们看到的明暗的是什么样子的
Blinn-Phong着色模型
这个模型着色解决