InkSoul/content/computergraphic/Z-Buffer_深度缓存.md

47 lines
1.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: "Z-Buffer 深度缓存"
date: 2022-05-18T14:07:33+08:00
---
##### Painter's Algorithm 画家算法
起源于油画绘制方式,从后往前,依次覆盖后面的物体
需要对不同深度的物体进行分类来确定面与面的绘制顺序,复杂度为$O(n\log n)$,其中n为三角形的个数也存在一个无法解决的问题不能处理无法确定绘制顺序的物体例如下图互相遮挡的情况
![](../../images/unresolvable_depth_order.png)
###### Z-Buffer
主要思想
1. 对于每一个采样点或像素存储一个最小的z值(深度值)
2. 存储方式与frame buffer存储颜色值的方式相同在depth buffer里存储深度值
出于简化考虑我们通常认为z值始终是正数这意味着越小的值代表采样点或像素距离相机越近越大的值则代表距离越远
Z-Buffer会在生成渲染图的同时根据各采样点像素的深度值生成深度图,颜色越深代表距离越近,越浅则越远
![](../../images/Depth_map.png)
算法
初始化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为三角形面的数量
![](../../images/Z-Buffer_test.png)