图形学初识--深度测试

前言

本章节补充一下深度测试的内容,主要包含:为什么要有深度测试?深度测试现代实现方式?

正文

为什么要有深度测试?

画家算法

当我们渲染两个三角形的时候,如何体现出遮挡关系的呢?实际上一开始,就是谁先渲染谁就可能被覆盖,这种算法就是画家算法。

就如起名,就像画家画画一样,先画的再后面,同样的区域后画的覆盖之!如下图所示:

在这里插入图片描述

循环遮挡

这个山、草地、大树就体现出了这种层次关系,但是当我们需要处理特别复杂的遮挡关系的时候,这种算法就无能为力了,如下所示:

在这里插入图片描述

这种情况就是循环遮挡的关系,无法单纯的实现完成!所以需要引入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也都是可以设置的!

结尾:喜欢的小伙伴点点关注+赞哦!

你们的点赞就是我创作的最大动力!希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!

### OpenGL基础知识与初识实验 #### 什么是OpenGL? OpenGL(Open Graphics Library)是一个跨语言、跨平台的应用程序接口(API),用于渲染2D和3D矢量图形[^1]。它提供了许多功能强大的工具,使开发者能够创建复杂的视觉效果并控制硬件加速。 #### 初识实验的目的 通过学习OpenGL的基础知识以及实践简单程序,可以达到以下几个目标: - 熟悉编程环境; - 掌握光栅图形显示器的特点及其应用; - 学习计算机绘图的核心概念; - 使用VC++结合OpenGL设计一个可以在屏幕上生成任意像素点的程序[^1]。 #### 实验所需准备 为了顺利完成这个初识实验,您需要准备好以下几项内容: - 安装Visual Studio集成开发环境(推荐版本为VS2019及以上)。注意不同版本可能会影响OpenGL库文件的位置配置[^2]。 - 配置好OpenGL支持的相关库文件,比如GLUT或者FreeGLUT等辅助工具包[^3]。 #### 编写第一个OpenGL程序 下面展示了一个非常基础的例子——如何在一个窗口中绘制单个红色像素点: ```cpp #include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区 glColor3f(1.0, 0.0, 0.0); // 设置当前绘图颜色为红 glBegin(GL_POINTS); glVertex2i(100, 100); // 绘制位于坐标 (100, 100) 的一点 glEnd(); glFlush(); // 强制执行所有OpenGL命令 } int main(int argc, char* argv[]) { glutInit(&argc, argv); // 初始化 GLUT 库 glutCreateWindow("First Point"); // 创建名为 "First Point" 的窗口 glutDisplayFunc(display); // 注册显示回调函数 glutMainLoop(); // 进入主事件循环 } ``` 此代码片段展示了最基本的OpenGL应用程序结构,包括初始化、定义绘图逻辑以及进入消息循环等功能模块[^1]。 #### 关于状态管理 在实际操作过程中,还需要关注各种OpenGL状态参数的设定。例如开启/关闭某些特效如光照、纹理映射或是深度测试等都可以通过`glEnable()` 和 `glDisable()` 函数实现[^3]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值