【OpenGL】笔记十九、深度测试

2023-10-30

1. 流程

在前面的教程中,我们有简略介绍过深度测试,它的存在帮助我们最终渲染的画面不会存在那些本应被遮挡住了的图像,其实若深究其中的原理的话,倒也没多复杂,就是每次渲染一个图形时测测当前这个要渲染的像素是否是目前离屏幕最近的,若是,就说明没有被其他物体遮挡,就可以把它的颜色映射到屏幕上,而这个距离就是由depth_buffer所存储,每次渲染一个新图形的时候我们就去比较和更新这个buffer。
在这里插入图片描述

1.1 深度测试

一般情况下,深度测试默认是禁用的,所以如果要启用深度测试的话,我们需要用GL_DEPTH_TEST选项来启用它:

glEnable(GL_DEPTH_TEST);

同时我们还应该在每个渲染迭代之前使用GL_DEPTH_BUFFER_BIT来清除深度缓冲,否则会仍在使用上一次渲染迭代中的写入的深度值:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

当我们要固定对某个深度距离进行设置时(比如深度大于某个固定的值时不渲染),可以让它每次只进行深度测试,不进行深度更新:

glDepthMask(GL_FALSE);

当然,默认情况下我们都是用当前的深度与buffer中的深度比较,若是当前的深度更大就不渲染,这符合我们的日常经验,那么如果要改变它的判断条件该怎么办呢?我们可以通过glDepthFunc函数进行更改:

glDepthFunc(GL_LESS);

它有以下几种参数:
在这里插入图片描述

1.2 深度值精度

深度缓存中存储的深度值是一个归一化的值,在0-1之间,线性的归一化由下式算出:
在这里插入图片描述
在这里插入图片描述
但是实际上,我们用于计算的z值是经过MVP变换的z值,已经在前面的透视投影矩阵中已经发生了非线性变换:

透视投影矩阵的推导

这就使得在近处的物体进行深度测试需要的精度更大!
我们就以另一种方式来近似这种非线性:
在这里插入图片描述
在这里插入图片描述
可以看到,深度值很大一部分是由很小的z值所决定的,这给了近处的物体很大的深度精度。这个(从观察者的视角)变换z值的方程是嵌入在投影矩阵中的,所以当我们想将一个顶点坐标从观察空间至裁剪空间的时候这个非线性方程就被应用了。

1.3 深度冲突

在使用各种建模软件时,如果我们将两个物体的面放的过于接近,由于上节提到的精度因素,它们可能会无法判断哪个物体更前,表面就会发生闪烁,远处的深度冲突还会更甚:
在这里插入图片描述
我们因为计算机的精度限制,没有办法彻底解决这种问题,只能尽量避免,下面给出几种方法:

第一个也是最重要的技巧是永远不要把多个物体摆得太靠近,以至于它们的一些三角形会重叠。

第二个技巧是尽可能将近平面设置远一些。在前面我们提到了精度在靠近近平面时是非常高的,所以如果我们将近平面远离观察者,我们将会对整个平截头体有着更大的精度。然而,将近平面设置太远将会导致近处的物体被裁剪掉,所以这通常需要实验和微调来决定最适合你的场景的近平面距离。

另外一个很好的技巧是牺牲一些性能,使用更高精度的深度缓冲。大部分深度缓冲的精度都是24位的,但现在大部分的显卡都支持32位的深度缓冲,这将会极大地提高精度。所以,牺牲掉一些性能,你就能获得更高精度的深度测试,减少深度冲突。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【OpenGL】笔记十九、深度测试 的相关文章

  • 请求的资源不支持 HTTP 方法“GET”

    我的路线配置正确 并且我的方法具有装饰标签 我仍然收到 请求的资源不支持 HTTP 方法 GET 消息 System Web Mvc AcceptVerbs GET POST System Web Mvc HttpGet public st
  • 在 C# 中实例化 python 类

    我已经用 python 编写了一个类 我想通过 IronPython 将其包装到 net 程序集中 并在 C 应用程序中实例化 我已将该类迁移到 IronPython 创建了一个库程序集并引用了它 现在 我如何真正获得该类的实例 该类看起来
  • Rx Framework:在超时时执行操作,而不中断原始可观察序列

    给定一个可观察的源 通过轮询低级设备的 变化 状态生成 observable source metacode IObservable
  • C++ 中的字符串到 LPCWSTR

    我正在尝试从字符串转换为 LPCWSTR 我使用多位 1 例如 LPCWSTR ToLPCWSTR string text LPCWSTR sw LPCWSTR text c str return sw 2 返回中文字符 LPCWSTR T
  • ASP .NET MVC 5 - 客户地址一对一关系

    我在这里查看了论坛 实际上发现了一些类似的问题 但不是相同的问题 类似的解决方案没有给我正确的答案 我正在使用实体框架和代码优先方法来处理 ASP NET MVC 5 我想建立客户 gt 地址一对一关系的模型 我建模的是 客户等级 publ
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 模拟 EF core dbcontext 和 dbset

    我正在使用 ASP NET Core 2 2 EF Core 和 MOQ 当我运行测试时 我收到此错误 消息 System NotSupportedException 非虚拟 可在 VB 中重写 成员上的设置无效 x gt x Movies
  • 为什么 CMake 不通过在定义该变量之前创建的 CMAKE_CXX_STANDARD 将语言标准编译标志添加到目标?

    我在用着cmake version 3 22 1 and c Ubuntu 11 3 0 1ubuntu1 22 04 11 3 0 以及非常简约的CMakeLists txt 我无法让 CMAKE 使用 C 20 Setting set
  • 将 Uploadify 与 Sharepoint 和 .net 结合使用

    我在共享点页面上有一些由 JQuery 生成的 html 我想在这个 html 中使用 uploadify 将文件上传到服务器 亚历山大 https stackoverflow com users 25427 alexander gyosh
  • 将 gcov 与 CMake/CDash 结合使用的详细指南?

    我在我的项目中使用 CMake 并设置了 cdash 服务器以进行连续 夜间构建 一切运行良好 通过设置 crontab 我们可以将每小时 每晚的构建 测试结果自动上传到我们的 cdash 服务器 我的下一步是将测试覆盖率报告添加到构建中
  • 如何在Qt无框窗口中实现QSizeGrip?

    如何使用 Qt 无框窗口实现 QSizeGrip 代码会是什么样的 您只需在布局内窗口的一角添加 QSizeGrip 即可使其保持在该角落 QDialog dialog new QDialog 0 Qt FramelessWindowHin
  • 混合 VS2012 平台工具集

    我们正在从 VS2005 切换到 VS2012 update 2 我们正在构建大量 主要是控制台 本机 C 无 MFC ATL 可执行文件 它们使用几个常见的静态链接库 这些可执行文件主要在 Win7 计算机上运行 但有些也部署在较旧的 X
  • C# 列表框 ObservableCollection

    我正在尝试使用 ListBox DataSource ObservableCollection 但是我不知道如何在 OC 更新时让列表框自动更新 我可以在 OC 上挂接 CollectionChanged 事件 但是我需要对列表框执行什么操
  • 如何解决素数函数的大O表示法?

    我正在尝试理解 Big O 表示法 很抱歉 如果我问的问题太明显了 但我似乎无法理解这一点 我有以下 C 代码函数 我正在尝试为其计算 Big O 表示法 for i 2 i lt 100 i for j 2 j lt i j j if i
  • C++ 静态工厂构造函数

    我正在进行模拟 它需要创建多个相当相似的模型 我的想法是有一个名为 Model 的类并使用静态工厂方法来构造模型 例如 模型 createTriangle or 模型 createFromFile 我从以前的 java 代码中汲取了这个想法
  • “sizeof”对不完整类型列表结构 C 的无效应用

    我正在尝试实现一种处理页面错误的替换算法 因此 我尝试使用 malloc 创建一个循环链表 但出现以下错误 无效的应用程序sizeof to incomplete typepageInMemory 以下是代码 typedef struct
  • 是否可以从.NET Core中间件检索控制器的操作结果?

    public class UsersController APIControllerBase public UsersController public Client Get return new Client ClientID 1 Las
  • STL 向量、迭代器和插入 (C++)

    我有一个将向量的迭代器传递到的方法 在这个方法中 我想向向量中添加一些元素 但我不确定当只有迭代器时这是否可行 void GUIComponentText AddAttributes vector
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • 访问 Visual Studio 扩展中的当前代码窗格

    我正在编写一个 Visual Studio 2010 扩展 在代码视图中带有右键单击菜单 我希望能够从菜单项事件处理程序检查当前代码 但无法在对象模型中找到执行此操作的位置 如何在 Visual Studio 扩展中访问当前窗口中的代码 E

随机推荐

  • leetcode格式二叉树生成工具(C++)

    介绍 输入leetcode测试用例类型字符串 返回根节点指针 判断逻辑和leetcode一致 null结点无须额外输入null子结点 并且自动舍弃无效结点 例如输入 1 null 2 null null 3 算法会自动舍弃结点3 网上找的都
  • 2021-05-01

    def print topic texts n topics n words 输出主题模型结果 param n topics LDA主题数量 param n words 主题的词范围 数量 return 输出公共主题 单日主题 准备语料库
  • python中的类与对象

    1 类和对象的关系 类就相当于 lt 模板 gt 或者 lt 模具 gt 对象就相当于 lt 产品 gt 得有了类 我们才能制造各种对象 就像我们有了模具 才能生产各种产品一样 Python中 万事万物都可以是对象 类 这种模板层级的本身也
  • linux入门---如何实现用户切换

    目录标题 基本用户认识 用户的切换 su su exit su 用户名 sudo 基本用户认识 在linux系统中将用户分为两个大类一个是root用户一个是普通用户 root用户是linux操作系统的超级管理员 相当于古代的皇帝不会受到任何
  • spring 事务总结

    参考视频 https www bilibili com video BV1aC4y1p7bF p 5 参考文档 https www cnblogs com myitnews p 12364455 html autoid 4 0 0 事务开启
  • 电源防反接电路设计

    在直流电源系统中 电源的输入端 为了防止电源正负极接反 通常会在输入端对电源进行防反接保护 防反接保护的方法有很多种 今天就来介绍一下 二极管防反接 利用二极管的单向导通特点实现防反接 这种方式是最简单的防反接方法 成本也低 但是缺点也很明
  • 机器学习概述

    一 定义 机器学习是一门从数据中研究算法的科学学科 机器学习直白来讲 是根据已有的数据 进行算法选择 并基于算法和数据构建模型 最终对未来进行预测 通过数据训练出一个模型 gt 预测未知属性 理性认识 输入 x X 属性值 输出 y Y 目
  • string篇

    目录 构造函数原型 赋值重载函数 assign 拼接函数原型 append 查找和替换函数原型 find replace 字符串比较函数 compare 字符存取 at 插入和删除字符串 insert erase 获取子串 substr s
  • Swift 使用CocoaPods 导入第三方网络库——Alamofire

    1 在已经安装了CocoaPods的前提下 cd进入项目所在目录 创建Podfile文件 touch Podfile 2 打开pod file文件 open e Podfile 3 在打开的Podfile文本编辑器里输入 source ht
  • 【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

    springboot篇章整体栏目 一 springboot整合swagger 超详细 二 springboot整合swagger 自定义 超详细 三 springboot整合token 超详细 四 springboot整合mybatis p
  • 基于Java+SpringBoot+Vue+Uniapp前后端分离疫情酒店管控系统设计与实现(有需求文档、演示视频)

    博主介绍 全网粉丝3W 全栈开发工程师 从事多年软件开发 在大厂呆过 持有软件中级 六级等证书 可提供微服务项目搭建与毕业项目实战 博主也曾写过优秀论文 查重率极低 在这方面有丰富的经验 博主作品 Java项目案例 主要基于SpringBo
  • GPS监控经济效益

    一 贵公司车辆使用过程中 是否有一些困惑 1 车辆去向不明 行驶路线无法掌控 车辆离开就好像失控一样 2 车辆利用率低 一天的事情两天做 真正的 早出晚归 3 车辆空载率高 由于货主和物流企业之间信息交流不畅 或者公司调度因为缺乏有效的实时
  • python 金融时间序列分析_利用动态深度学习预测金融时间序列基于Python

    作者 Jeremy Curuksu Forecasting the evolution of events over time is essential to many applications such as option pricing
  • 【深度学习】【NLP】NLP课件整理 第四章:RNN,LSTM,GRU,注意力机制,Attention

    文档 4 1 认识RNN模型 note 了解什么是RNN模型 了解RNN模型的作用 了解RNN模型的分类 文档 4 2 传统RNN模型 note 了解传统RNN的内部结构及计算公式 掌握Pytorch中传统RNN工具的使用 了解传统RNN的
  • hadoop安装

    hadoop思想 分而治之 并行计算 计算向数据移动 数据本地化读取 模块 common 支持hadoop其他模块的公共工具 hdsf 分布式存储 相比于其他分布式文件系统设计思想是为了做计算使用 MapReduce 分布式计算 yarn
  • 数字孪生模型构建理论及应用

    源自 计算机集成制造系统 作者 陶飞 张贺 戚庆林 徐 俊 孙铮 胡天亮 刘晓军 刘庭煜 关俊涛 陈畅宇 孟凡伟 张辰源 李志远 魏永利 朱铭浩 肖斌 摘 要 数字孪生作为实现数字化转型和促进智能化升级的重要使能途径 一直备受各行各业关注
  • 模拟器件

    模拟部分RF也有采用cmos工艺的 就是堆一些二极管 三极管做一个设备 感觉和大学接触的模拟电路很类似 RF现在工艺和asic数字差不多了 也22nm了 我一直以为RF使用GaAs 和数字部分不同 哈哈哈 大约几千个器件堆个模拟器件出来 好
  • 【机器学习】为何要归一化和归一化,标准化的处理方法

    为何要归一化 如何归一化和标准化 为何要归一化 提升模型的收敛速度 提升模型的精度 总结 如何归一化和标准化 min max 0 1 标准化 z score 标准差 标准化 nonlinearity 非线性 归一化 为何要归一化 提升模型的
  • 生产排程系统_案例:PCBA应用易普优APS实现高级计划排程

    一 项目介绍 1 生产计划现状 某PCBA企业 以下简称A企业 的产品生产是典型的多品种 小批量 多变化的生产模式 其中产品种类有1000多种 主流的200多种 每个月数百个生产订单 分解到工序以后的工单达数千个 该企业的计划采用了计划部
  • 【OpenGL】笔记十九、深度测试

    1 流程 在前面的教程中 我们有简略介绍过深度测试 它的存在帮助我们最终渲染的画面不会存在那些本应被遮挡住了的图像 其实若深究其中的原理的话 倒也没多复杂 就是每次渲染一个图形时测测当前这个要渲染的像素是否是目前离屏幕最近的 若是 就说明没