主要内容:
- 深度缓冲
- 光照
- 着色
- 渲染管线
Z-buffering——可见性/遮挡问题
如何将重叠的三角形的远近位置绘制——近处遮挡远处
画家(油画家)算法
先绘制远处物体,然后绘制近处物体遮挡远处—>图形学中过程就是先将远处进行光栅化绘制后,再绘制近处
- O(n log n) 时间对深度进行排序
存在问题
如下图右所示,两两之间存在互相遮挡关系,则绘制会存在问题——也就是无法定义互相的深度关系
Z-Buffer 引用
无法对对象或者三角形进行深度排序时,考虑使用针对像素点的深度,也就是对每个像素点记录最浅的深度
图形学中做法:
- 会渲染最后的结果图像(frame buffer stores color values)
- 同时也会生成另外一张图—只存它所看到的物体最浅的信息(也就是深度图/深度缓存)(就是depth buffer (z-buffer) stores depth )
概念定义:
针对深度测试有如下约定:
- 首先在深度中的话z是永远为正的,也就是像素点的深度距离人眼位置(打个比喻)
- z越小越近,反之则也成立
Z-Buffer例子
右图中z越近则颜色更趋近于黑色,越远则越白
算法实现
核心思想就是求最小值
//初始化depth buffer to ∞
for (each triangle T)
for (each sample (x,y,z) in T)
// closest sample so far
if (z < zbuffer[x,y]){
framebuffer[x,y] = rgb; // update color
zbuffer[x,y] = z; // update depth
}
else
; // do nothing, this sample is occluded
流程如下所示:针对像素
- 逐像素初始化为无限大
- 新的三角形绘制,比较深度后绘制
- 绘制后,又有新的三角形的进入,依次比较深度后,若新的小于则进行覆盖更新
算法的复杂度
- 时间为O(n)——挨个记录了当前最小值,并没有进行排序
- 上图中绘制顺序不一样会如何?——跟顺序无关,只跟像素的深度有关,不考虑相等情况
- 深度完全一样——浮点值比较
透明物体如何处理?(待补充)
Shading
定义
- 引入明暗不同
- 对物体应用不同的材质
Blinn-Phong Reflectance Model
经验模型,并不是完全符合物理模型
如下图中茶杯会存在高光、漫反射和间接光照(环境光照)
间接光照:这里假设接收到的来自四面八方的光是一个常量
很小的局部shading
有如下假设:
- 局部点很小可以看作为一个平面,如果需要针对整个物体则需要通过着色频率进行不停的绘制
- 局部性:不考虑阴影,只考虑着色,也就输不考虑其它物体存在
漫反射(Diffuse Reflection )
一束光打到一个点,会朝向四面八方进行漫反射
- 一个平面在接收光照时,如果与光照方向为垂直则是可以接收全部光照,若存在角度呢?
- 存在角度情况下使用Lambert’s cosine law ,也就是余弦夹角计算,设从接收位置取中心点往光照方向为l,该点的法向量为n,通过点乘(前者均为单位向量)就可得夹角余弦,那么也就是接收平面与光照方向的夹角
- 存在角度情况下使用Lambert’s cosine law ,也就是余弦夹角计算,设从接收位置取中心点往光照方向为l,该点的法向量为n,通过点乘(前者均为单位向量)就可得夹角余弦,那么也就是接收平面与光照方向的夹角