[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)

一、前言

通过光栅化我们知道,模型的三角形最终都被画在了屏幕上成为了像素,那么真实的场景往往有许多模型,也就是有很多三角形需要被画在屏幕上,这么多的三角形如何正确的判断它们的遮挡关系,从而把离我们摄像机最近的三角形画出来是一个问题,而解决这个问题的方法就是我们今天要讲的Z-Buffer,中文名深度缓存/缓冲

二、画家算法

场景中有很多的物体,我们可以由远到近的一一把他们画在画布上来实现遮挡关系。例如:先画远处的山,再画地面,再画树。而此算法被称为画家算法

[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)_第1张图片
[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)_第2张图片
[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)_第3张图片

那如果碰到如下图这种情况怎么办?

[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)_第4张图片

显然,画家算法并不能解决这种复杂的遮挡关系,而且对顺序有着很直观印象的要求,这种要求无法让计算机理解。所以人们采取了新方案,也就是Z-Buffer

三、Z-Buffer

基本思想:

在渲染的过程中,同时生成渲染结果和一张深度图,其中深度图用来储存该像素上深度值最小的深度信息,在之后根据后续的深度结果决定是否更新该像素的深度值。

简单的说,就是在一个像素内,先默认深度为无限远,然后随着不断渲染,判断新的深度值和储存在其中的深度值的大小关系,如果新的深度小于存储的深度,那么就更新为新的深度,否则不更新,这样就可以确保该像素的深度值始终是正确的,距离摄像机最近的。

[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)_第5张图片

我们曾经规定过,相机始终是放在原点,朝向-z方向,那么此时我们就可以认为,z坐标的绝对值表示的就是深度的大小,z的绝对值越大说明深度越大,该点离我们越远,反之则越近。

[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)_第6张图片

渲染结果(左)和深度缓存得到的深度图(右)

[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)_第7张图片

深度缓存算法伪码

深度缓存的工作流程图示:

(R表示深度值为无限大)一个红色三角形被光栅化,紧接着一个蓝色三角形被光栅化,其中由深度缓存得出的遮挡关系发生的变化。

[计算机图形学]可见性与遮挡,Z-Buffer(前瞻预习/复习回顾)_第8张图片

深度缓存算法复杂度:

深度缓存算法复杂度为O(n),我们并没有做排序求遮挡关系,只是始终在求最小深度所以不是O(nlogn)

参考:

Lecture 07 Shading 1 (Illumination, Shading and Graphics Pipeline)_哔哩哔哩_bilibili

你可能感兴趣的:(计算机图形学,计算机图形学,图形学,图形渲染)