LearnOpenGL12——深度测试_baixiaofei567的博客-程序员宅基地

技术标签: 图形学  深度测试  opengl  

转载自
https://blog.csdn.net/qq_36696486/article/details/104378594
https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/01%20Depth%20testing/#_2
https://zhuanlan.zhihu.com/p/56739656

需要深度测试的原因

当我们渲染多个物体时,这多个物体之间存在互相遮挡的关系,被遮挡的物体的部分将不可见,也就是它离相机更远,为了告诉计算机被遮挡的物体不需要渲染,我们就需要对物体上的点做深度测试,检测它是否需要渲染。
为了实现上述的检测,就需要深度缓冲简单而言就是存储物体上点深度值的数组,假如深度值在0到1之间。这个数组一开始值为1,GPU会把该片元的深度值和已经存在于深度缓冲中的深度值进行比较。当目前渲染的物体的深度值小于缓冲区中存储的深度值时,就将这个值写入缓冲区,同时通过深度测试,如果与此相反,深度值大于缓冲区中的深度值,就是未通过深度测试,就不写入缓冲区,淘汰掉这个点(不做渲染)。
当然,比较函数可以自己定义,接下来会做介绍。

深度测试的时间

深度测试是在片段着色器运行之后(以及模板测试(Stencil Testing)运行之后)运行的
在这里插入图片描述

现在大部分的GPU都提供一个叫做提前深度测试(Early Depth Testing)Early Z技术的硬件特性。提前深度测试允许深度测试在片段着色器之前运行。只要我们清楚一个片段永远不会是可见的(它在其他物体之后),我们就能提前丢弃这个片段。
因为片段着色器通常开销都是很大的,如果计算出了深度,但是这个片元却没有通过测试,就是浪费时间,所以我们应该尽可能避免运行它们。当使用提前深度测试时,片段着色器的一个限制是你不能写入片段的深度值。如果一个片段着色器对它的深度值进行了写入,提前深度测试是不可能的。OpenGL不能提前知道深度值。

深度测试函数

深度测试主要有两个步骤,

  1. 对比缓冲区中的值,判断是否通过测试(Z Test)
  2. 是否将该值写入缓冲区(Z Write)

深度测试函数默认关闭,开启深度测试函数的方法:

glEnable(GL_DEPTH_TEST);

深度写入函数的控制开关:
可以想象,在某些情况下你会需要对所有片段都执行深度测试并丢弃相应的片段,但不希望更新深度缓冲。基本上来说,你在使用一个只读的(Read-only)深度缓冲。OpenGL允许我们禁用深度缓冲的写入,只需要设置它的深度掩码(Depth Mask)设置为GL_FALSE就可以了:

glDepthMask(GL_FALSE);
glDepthMask(GL_TRUE);

比较函数

通过比较函数,我们可以自定义刷新缓冲区的方式
默认情况下使用的深度函数是GL_LESS,它将会丢弃深度值大于等于当前深度缓冲值的所有片段。

glDepthFunc(GL_ALWAYS);

在这里插入图片描述

清除深度缓存

我们每次渲染一遍之后需要将缓存值清空,不然可能会出现画面错误情况

清除方式和清楚颜色缓存一样

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

深度值精度

深度缓冲包含了一个介于0.0和1.0之间的深度值,它将会与观察者视角所看见的场景中所有物体的z值进行比较。观察空间的z值可能是投影平截头体的近平面(Near)和远平面(Far)之间的任何值。我们需要一种方式来将这些观察空间的z值变换到[0, 1]范围之间。
在实践中是几乎永远不会使用这样的线性深度缓冲(Linear Depth Buffer)的。要想有正确的投影性质,需要使用一个非线性的深度方程,它是与 1/z 成正比的。它做的就是在z值很小的时候提供非常高的精度,而在z值很远的时候提供更少的精度。
计算深度值的函数
在这里插入图片描述
可以看到,深度值很大一部分是由很小的z值所决定的,这给了近处的物体很大的深度精度。
在这里插入图片描述

深度冲突

出现的问题:

  1. 当大量物体离摄像机极远时,会出现深度值错误的现象,因为太过集中在1这个值处了
  2. 当大量物体在同一平面时,会出现深度值相同(因为是float,所以可能每次渲染的结果都不同,造成抖动现象)

解决深度冲突

深度冲突不能够被完全避免,但一般会有一些技巧有助于在你的场景中减轻或者完全避免深度冲突、

  1. 第一个也是最重要的技巧是永远不要把多个物体摆得太靠近,以至于它们的一些三角形会重叠。通过在两个物体之间设置一个用户无法注意到的偏移值,你可以完全避免这两个物体之间的深度冲突。
  2. 设置相机的远近平面来达到最佳效果
  3. 使用更高精度的深度缓冲。大部分深度缓冲的精度都是24位的,但现在大部分的显卡都支持32位的深度缓冲,这将会极大地提高精度。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/J_avaSmallWhite/article/details/113834272

智能推荐

Oracle数据库的备份与规复_weixin_30257433的博客-程序员宅基地

滥觞:网海拾贝 ---- 当我们运用一个数据库时,总渴望数据库的内容是牢靠的、切确的,但因为计较机零碎的偏差(包孕呆板偏差、介质偏差、误使用等),数据库无意也可以遭到破损,这时怎样尽快规单数据就成为燃眉之急。假如往常对数据库做了备份,那么此时规单数据就显得很轻易。由此可见,做好数据库的备份是何等的重要,下面笔者就以ORACLE7为例,来讲演一下数据库的备份和规复。OR...

GNU风格 汇编语法总结_一口Linux的博客-程序员宅基地_gnu汇编

汇编源程序一般用于系统最基本的初始化:初始化堆栈指针、设置页表、操作 ARM的协处理器等。这些初始化工作完成后就可以跳转到C代码main函数中执行。1、 GNU汇编语言语句格式任何Linux汇编行都是如下结构:[:][} @commentinstruction:指令directive:伪操作pseudo-instruction:伪指令:标号, GNU汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。comment:语句的注释下面定义一个"add"的函数,最

FPAG学习笔记——I2C接口实现_星河带悦流的博客-程序员宅基地

I2C总线介绍  I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。  主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过

django 消息模块 (messages ) 的使用_Alvin__Yang的博客-程序员宅基地_django message用法

django 使用消息模块,要注意的是,返回的render_to_response 需要加上context_instance具体的:from django.contrib import messagesfrom django.shortcuts import render_to_response,RequestContextfrom django.template import

从客户端(hidXML="<FlexCell xml:space=...")中检测到有潜在危险的Request.Form值_weixin_30691871的博客-程序员宅基地

使用FlexCell生产报表,使用浏览器查看报表出现以下错误提示;解决方法解决方案一:修改浏览器为兼容模式解决方案二: 在.aspx文件头中加入这句: &lt;%@ Page validateRequest="false"%&gt; 解决方案三: 修改web.config文件: &lt;configuration&gt; &lt;system.web&gt; &...

mysql50521_MySQL5.5 安装mcafee mysql-audit插件 不成功_新德里的雨的博客-程序员宅基地

安装步骤还是比较简单的,只有几步:1)查看插件目录mysql&gt; SHOW GLOBAL VARIABLES LIKE 'plugin_dir';+---------------+--------------------+| Variable_name | Value |+---------------+--------------------+| plugin_di...

随便推点

2004计算机一级冲刺,2016年计算机一级MSOffice冲刺题及答案_文小刚的博客-程序员宅基地

2016年计算机一级MSOffice冲刺题及答案同学们在最后几天复习计算机等级考试时,要学会对自己所学知识进行查漏补缺,下面百分网小编为大家搜索整理了关于计算机一级MSOffice冲刺题及答案,欢迎参考练习,希望对大家备考有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网。1.下列哪些滤镜只对RGB滤镜起作用:BA. 马赛克   B. 光照效果   C. 波纹   D. 浮雕效果2.在使用...

python 使用 openpyxl 模块控制 excel 常用操作_菜猫小六的博客-程序员宅基地

title: python 使用 openpyxl 模块控制 excel 常用操作tags: [&#39;openpyxl&#39;,&#39;python&#39;,&#39;excel&#39;]date: 2021-05-10categories: &quot;搬砖&quot;使用的库openpyxlimport openpyxl作用的对象文件后缀名为 .xlsxexcel几个操作单元工作簿 workbook表单 wooksheet行.

oracle direct-load,sql*loader中Direct参数如何使用?_何欣颜的博客-程序员宅基地

SQL&gt; create table test_sqlldr_direct nologging as selectOWNER,OBJECT_NAME ,SUBOBJECT_NAME ,OBJECT_ID , DATA_OBJECT_ID , OBJECT_TYPE from all_objects where rownum &lt; 1;表已创建。...

【源码】JUC —— LinkedBlockingQueue 浅析_小水牛...的博客-程序员宅基地

【源码】JUC —— LinkedBlockingQueue 浅析前言LinkedBlockingQueueNode属性、构造方法add(E e) &amp; offer(E e)put(E e) &amp; offer(E e, long timeout, TimeUnit unit)enqueue(Node node)remove() &amp; poll()take() &amp; poll(long timeout, TimeUnit unit)前言LinkedBlockingQueue,基于

dw显示云服务器的数据库,dw如何与测试服务器连接数据库_weixin_39895167的博客-程序员宅基地

dw如何与测试服务器连接数据库 内容精选换一换华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。dw如何与测试服务器连接数据库 相关内容我们强烈建议您使用...

修改隐含参数_library_cache_advice解决性能问题一例(转)_csdn909034的博客-程序员宅基地

客户的一套重要生产系统,出现了性能问题。这个问题涉及的信息如下:数据库主机的CPU利用率长期在100%左右。应用系统在晚上进行调整后,开始出现了问题。数据库中出现大量的latch: shared pool、latch: libr...

推荐文章

热门文章

相关标签