文章目录
- 前言
- 正文
- 为什么要有深度测试?
- 画家算法
- 循环遮挡
- 深度测试当代最常见实现方式?
- 总述
- 什么是z-buffer呢?
- z-buffer从哪来呢?
- 如何利用z-buffer实现深度测试?
- 举个例子
- 结尾:喜欢的小伙伴点点关注+赞哦!
前言
本章节补充一下深度测试的内容,主要包含:为什么要有深度测试?深度测试现代实现方式?
正文
为什么要有深度测试?
画家算法
当我们渲染两个三角形的时候,如何体现出遮挡关系的呢?实际上一开始,就是谁先渲染谁就可能被覆盖,这种算法就是画家算法。
就如起名,就像画家画画一样,先画的再后面,同样的区域后画的覆盖之!如下图所示:
循环遮挡
这个山、草地、大树就体现出了这种层次关系,但是当我们需要处理特别复杂的遮挡关系的时候,这种算法就无能为力了,如下所示:
这种情况就是循环遮挡的关系,无法单纯的实现完成!所以需要引入Z-buer的机制来进行解决这种遮挡问题。
总结一下: 深度测试的本质是为了体现先后的遮挡关系。简单的情形,如画家算法就可以满足,复杂的情形,就需要利用z-buffer机制处理!
深度测试当代最常见实现方式?
总述
通过引入z-buffer机制,通过空间换时间的方法,从而处理像素级别的遮挡问题!
什么是z-buffer呢?
其实本质上就是一块和屏幕空间分辨率同等大小的内存空间,每个元素是一个浮点数!
z-buffer从哪来呢?
大家都看过作者之前讲述屏幕空间变换的那一章节,经过屏幕变换后,得到了每个顶点的z坐标范围为 [ 0 , 1 ] [0,1] [0,1] ,这个z就是代表一种前后关系。
但是这只是顶点级别的前后关系,如何得到像素级别的z值呢?其实很容易联想到,就是三角形光栅化的时候,利用重心坐标插值算法进行插值呗!
如何利用z-buffer实现深度测试?
其实它的思想很混合有点相似,但是它没有中间的部分,它要么通过测试,显示该像素;要么未通过测试,不显示该像素。具体的描述如下:
当我们需要针对 ( x , y ) (x,y) (x,y) 做深度测试时,我们首先获取z-buffer中的对应深度值,假设为 l a s t z last_z lastz ,对于即将渲染的当前像素的深度值,假设为 c u r r e n t z current_z currentz,通过比较两者大小,如果被挡住则丢弃;如果更靠前,则留下来。就是这么简单!
举个例子
假设z越靠近0越近,越靠近1越远,则如下图的初始z-buffer
当我们需要绘制几个z值为0.4的像素时,如下:
当又需要绘制一个新的像素区域时,如下:
是不是很简单呢!当然了,这个深度测试的通过判定,究竟是小的通过,还是大的通过,往往也是由需求而定,各个图形API也都是可以设置的!
结尾:喜欢的小伙伴点点关注+赞哦!
你们的点赞就是我创作的最大动力!希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!