47 lines
1.6 KiB
Markdown
47 lines
1.6 KiB
Markdown
---
|
||
title: "Z-Buffer 深度缓存"
|
||
date: 2022-05-18T14:07:33+08:00
|
||
|
||
---
|
||
|
||
##### Painter's Algorithm 画家算法
|
||
|
||
起源于油画绘制方式,从后往前,依次覆盖后面的物体
|
||
|
||
需要对不同深度的物体进行分类来确定面与面的绘制顺序,复杂度为$O(n\log n)$,其中n为三角形的个数,也存在一个无法解决的问题,不能处理无法确定绘制顺序的物体,例如下图互相遮挡的情况
|
||
|
||

|
||
|
||
|
||
###### Z-Buffer
|
||
|
||
主要思想
|
||
1. 对于每一个采样点或像素存储一个最小的z值(深度值)
|
||
2. 存储方式与frame buffer存储颜色值的方式相同,在depth buffer里存储深度值
|
||
|
||
出于简化考虑,我们通常认为z值始终是正数,这意味着越小的值代表采样点或像素距离相机越近,越大的值则代表距离越远
|
||
|
||
Z-Buffer会在生成渲染图的同时根据各采样点(像素)的深度值生成深度图,颜色越深代表距离越近,越浅则越远
|
||
|
||

|
||
|
||
算法
|
||
|
||
初始化depth buffer的所有值为$\infty$
|
||
|
||
在光栅化的流程中增加如下伪代码流程
|
||
```s
|
||
for (each triangle T)
|
||
for(each sample(x,y,z)in T) //循环每一个采样点,深度值在采样时确定
|
||
if(z<zbuffer[x,y]) //判断深度值大小,确定远近
|
||
framebuffer[x,y]=rgb; //更新颜色值
|
||
zbuffer[x,y]=z; //更新深度值
|
||
else
|
||
; //什么都不做,因为采样流程已经完成
|
||
```
|
||
|
||
整体算法流程会形成如下图效果,复杂度为O(n),n为三角形面的数量
|
||
|
||

|
||
|