来源:games101图形学入门Lecture07
Lingqi Yan
UC Santa Barbara
Z-Buffer
Idea:
- Store current min. z-value for each sample (pixel)
- Needs an additional buffer for depth values
- frame buffer stores color values
- depth buffer (z-buffer) stores depth
IMPORTANT: For simplicity we suppose z is always positive
(smaller z -> closer, larger z -> further)
我们同时要生成两个缓存:frame buffer和depth buffer。
并且现在我们假设深度就是这个点离相机的距离——永远为正。
意思就是以下两张图——记录这个物体颜色的图,和记录这个物体深度的图,是同步生成的。
Z-Buffer可不能处理透明物体,透明物体需要特殊的处理。
- 深度图如何理解呢?对于这张图,深度越近,颜色就越深。(颜色值越小,当然就越黑)
- 当我们把物体放到地板上,物体会遮住地板的一部分。当记录下的物体的深度小于地板的深度,那么我们就把这个物体画在地板“前面”,并且更新这个深度为一个更浅的深度。
Z-Buffer Algorithm
Initialize depth buffer to
∞
∞
∞
首先将所有值都初始化为无限大
During rasterization:
在光栅化的过程中:
for (each triangle T)
for (each sample (x,y,z) in T)
if (z < zbuffer[x,y]) // closest sample so far 如果这个像素是目前为止最浅的
framebuffer[x,y] = rgb; // update color 更新颜色值
zbuffer[x,y] = z; // update depth 更新深度值
else
; // do nothing, this sample is occluded 什么都不做,这个像素已经被遮挡了
图解算法:渲染两个带深度并且会相交的三角形(R表示无限大,数字表示深度值)
Z-Buffer Complexity
Complexity 复杂度
- O(n) for n triangles (assuming constant coverage)
对于n个三角形,用O(n)的时间就能知道谁遮挡谁。 - How is it possible to sort n triangles in linear time?
我们并不排序,我们只找出每个像素的最小值。所以它是一个O(n)的算法
Drawing triangles in different orders? 更换渲染的顺序呢?
假设我们先画蓝色的三角形,再画红色的三角形,结果也是一样的。
毕竟,我们只考虑每个像素上深度的最小值,和三角形出现的顺序无关。