深度测试中的隐藏面消除技术

by STANCH

标签:#计算机图形学 #深度测试 #深度测试 #隐藏面消除

1.概述

根据我们的日常经验,近处的物体会挡住后面的物体,在三维场景中通常通过深度缓冲来实现这样的效果。深度缓冲记录着屏幕对应的每个像素的深度值。模型一开始所在的局部空间无深度,通过模型矩阵变换到世界空间,此时模型坐标已经变换到了齐次坐标(x,y,z,w),深度存在z分量。通过视图矩阵变换到观察空间,此时深度存在z分量(线性)。通过投影矩阵变换到裁剪空间,此时深度缓冲中裁剪空间的z分量变为z/w(已经变成了非线性的深度,下图),最后通过一些投影映射变换到屏幕空间。通过深度缓冲区,可以进行深度测试,从而确定像素的遮挡关系,保证渲染正确。这是深度缓冲最主要的作用。

来源:《细说图形学渲染管线》

深度测试的原理很简单:比较当前片段的深度值是否比深度缓冲中预设的值小(默认比较方式),如果是则更新深度缓冲和颜色缓冲;否则丢弃片段不更新缓冲区的值。

来源:《细说图形学渲染管线》

2.Z-Fighting

当渲染两个重叠的共面表面时,一个常见的问题是“Z-fighting”,即渲染器无法确定两个表面中的哪个更靠近相机,从而在重叠区域产生视觉伪影。产生Z-fighting是由于深度缓冲精度不够带来的问题。当同一个位置的片段具有相似的深度值时,由于深度缓冲精度不够无法决定应该显示那个片段,导致片段之间抢占深度的至高点,造成了视觉上的假象, 如下图所示。

来源:《细说图形学渲染管线》

解决z-fighting的一个常见技巧是让物体之间有一些偏移,不要将物体靠的太近;另一种技巧是使用高精度的深度缓冲。比如使用32bits的深度缓冲,但是这样会占用更多的显存资源。

3.隐藏面消除 (Hidden Surface Removal, HSR)

在绘制3D场景的时候,我们需要决定哪些部分对观察者是可见的,或者说哪些部分对观察者不可见,对于不可见的部分,我们应该及早的丢弃,例如在一个不透明的墙壁后的物体就不应该渲染。这种问题称之为隐藏面消除(Hidden surface elimination),或者称之为可见面确定(Visible surface detemination)。

来源:OpenGL学习脚印:深度测试(depth testing)

其实隐藏面消除的技术我们来说并不陌生,在渲染管线中图元组装的裁剪(Clipping)、背面剔除和Z-Buffer技术其实就是隐藏面消除的一种,只不过剔除的粒度有所不同,其中裁剪操作针对的是图元,而Z-Buffer是针对像素点。不同的隐藏面消除技术的主要区别在于剔除的粒度以及不同的剔除目的,但是最终目的都是相同的:减少到达片段着色器的片段的数量,提高渲染的性能。除了裁剪之外,我们下面还将介绍几种比较常见的HSR技术!

  • 视椎体剔除 (Viewing-Frustum Culling) 

视椎体剔除是最常见的一种剔除技术,对于大场景我们根本不可能每帧对每个物体都进行渲染,我们其实只需要渲染那些摄像机看得到的物体,也就是位于视椎体内的物体,其他位于视椎体外的物体根本不需要渲染,我们可以将其进行剔除,不送入渲染管线,提升渲染效率。一般来说,视椎体剔除是在CPU端进行剔除工作。视椎体剔除利用的是射线检测的方法,根据视椎体的六个平面来检测物体。我们一般利用物体包围盒(Bounding Box)来做交差检测,常见的包围盒有轴对齐包围盒(AABB)和有向包围盒(OBB)两种。由于场景中物体可能非常多,所以一般需要借助高效的数据结构来提升碰撞检测的性能,常见的用于3D场景碰撞检测的数据结构有:八叉树(OcTree)、二分空间划分(Binary Space Partitioning)、四叉树(Quad Tree)、场景图 (Scene Graphs)、kd树(K-DimensionalTree)和层次包围(Bounding Volume Hierarchies)。

来源:《基于无人机与深度学习的建筑震害评估方法》

  • 入口剔除 (Portal Culling) 

当我们位于室内时,我们就可以使用入口剔除技术进行裁剪优化了。我们可以将室内的门或者窗户看做视椎体来进行裁剪。不过我们其实看到入口剔除有很大的局限性,一般只能在室内环境下使用,无法再室外场景使用该技术,对于室外的大场景我们一般需要使用下面介绍的遮挡剔除技术。

来源:《细说图形学渲染管线》

  • 遮挡剔除 (Occlusion Culling) 

在城市或者森林这种大场景中,我们很容易发现物体之间有很多的遮挡关系,我们需要遮挡剔除技术去掉那些被挡住的物体,来提升渲染效率,如下图所示,左边的图是遮挡剔除前视椎体示意图,右边的图是进行遮挡剔除后需要渲染的物体,可以说大大减少了需要被渲染的物体数量。遮挡剔除的实现方法有很多,既有基于CPU的,也有基于GPU的,也可以混合使用CPU和GPU进行处理。一般进行遮挡剔除时,我们需要通过离线烘焙的犯法来预先计算出潜在可视集合(Potentially Visible Set,PVS)。PVS记录了每个地形块(Tiles)可能看到的物体的集合,用于运行时查找计算。在计算PVS时我们会将场景划分为小的地形块,在每个块上随机选取N个采样点,以这些采样点为起点发出射线来获取场景中相交的物体,记录下物体的ID,求出每个块对应的ID的集合。在运行时根据摄像机的位置获取每个块可见的物体进行渲染。

来源:《细说图形学渲染管线》

提高烘焙的精度通常有两种方法:一是通过减小地形块的大小;二是增加采样点数量。采样的方式有很多,如下面所示。增加采样点的数量可以获得更加精确的结果,减少在块之间切换出现物体闪现或闪失的情况。不过过多的采样点会大大增加离线烘焙的时间,所以需要根据实际情况进行选择采样的数量。我们发现其实基于烘焙的方法缺点还是很明显的:烘焙时间长,需要额外的包体以及无法处理动态的物体。

来源:《细说图形学渲染管线》

参考:

OpenGL学习脚印:深度测试(depth testing)_关闭深度测试时colour buffer-CSDN博客


  关注Mapmost,持续更新GIS、三维美术、计算机技术干货

Mapmost是一套以三维地图和时空计算为特色的数字孪生底座平台,包含了空间数据管理工具(Studio)、应用开发工具(SDK)、应用创作工具(Alpha)。平台能力已覆盖城市时空数据的集成、多源数据资源的发布管理,以及数字孪生应用开发工具链,满足企业开发者用户快速搭建数字孪生场景的切实需求,助力实现行业领先。

欢迎进入官网体验使用:Mapmost——让人与机器联合创作成为新常态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我对ChatGPT-5的期待

在科技飞速发展的今天,人工智能(AI)已经成为我们生活中不可或缺的一部分。尤其是近年来,随着ChatGPT等先进AI模型的推出,我们见证了AI技术在智能水平上的巨大飞跃。作为这一领域的最新成果,GPT-5的即将发布…

2005年下半年软件设计师【上午题】试题及答案

文章目录 2005年下半年软件设计师上午题--试题2005年下半年软件设计师上午题--答案 2005年下半年软件设计师上午题–试题 2005年下半年软件设计师上午题–答案

解决ssh: connect to host IP port 22: Connection timed out报错(scp传文件指定端口)

错误消息 ssh: connect to host IP port 22: Connection timed out 指出 SSH 客户端尝试连接到指定的 IP 地址和端口号(默认 SSH 端口是 22),但是连接超时了。这意味着客户端没有在预定时间内收到来自服务器的响应。 可能的原因 SSH 服务未…

C语言---C指针+ASCII码

内存地址:内存中每个字节单位都有一个编号(一般用十六进制表示) 存储类型 数据类型 *指针变量名;int *p; //定义了一个指针变量p,指向的数据是int类型的。访问指针所指向空间的内容用取内容运算符* &:取地址符&am…

LeetCode —— 只出现一次的数字

只出现一次的数字 I 本题依靠异或运算符的特性&#xff0c;两个相同数据异或等于0&#xff0c;数字与0异或为本身即可解答。代码如下: class Solution { public:int singleNumber(vector<int>& nums) {int ret 0;for (auto e : nums){ret ^ e;}return ret;} };只出…

数据模型(models)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 &#xff08;1&#xff09;在App中添加数据模型 在app1的models.py中添加如下代码&#xff1a; from django.db import models # 引入django.…

Qt开发 | Qt界面布局 | 水平布局 | 竖直布局 | 栅格布局 | 分裂器布局 | setLayout使用 | 添加右键菜单 | 布局切换与布局删除重构

文章目录 一、Qt界面布局二、Qt水平布局--QHBoxLayout三、Qt竖直布局四、Qt栅格布局五、分裂器布局代码实现六、setLayout使用说明七、布局切换与布局删除重构1.如何添加右键菜单2.布局切换与布局删除重构 一、Qt界面布局 Qt的界面布局类型可分为如下几种 水平布局&#xff08;…

谐波减速器行业发展速度有望加快 工业机器人领域为其最大需求端

谐波减速器行业发展速度有望加快 工业机器人领域为其最大需求端 谐波减速器指通过增大转矩、降低转速等方式实现减速目的的精密传动装置。谐波减速器具有轻量化、体积小、承载能力大、精度高、可靠性高、运行噪音小等优势&#xff0c;广泛应用于工业机器人、半导体制造、精密医…

AWS中国云配置强制MFA策略后导致AWS CLI和IDEA中无法使用问题

问题 之前的文章《AWS中国IAM用户强制使用MFA》&#xff0c;启用必须使用MFA策略才能使用AWS服务。但是&#xff0c;开启之后&#xff0c;遇到了本地开发环境的IDEA和AWS CLI不能正常调用ssm的配置中心问题。 解决思路 在本地配置文件中&#xff0c;配置使用能够正常使用ssm…

web开发前后端分离

文章目录 1.广义上的前后端分离 1.广义上的前后端分离 优点&#xff1a; 1.前后端分离&#xff0c;便于后期维护;2.前端服务器只需要返回静态界面&#xff0c;后端服务器只提供增删查改的数据返回&#xff0c;把数据的转换逻辑的处理压力转移到了客户端;

MySQL 8版本的新功能和改进有哪些?(MySQL收藏版)

目录 1. 简单介绍 2. 发展历史 3. MySQL 8产品特性 4. 数据库性能重点分析 1. 原生 JSON 支持改进 2. 隐式列优化 3. 改进的查询优化器 4. 并行查询 5. 分区表改进 MySQL 是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典公司 M…

了解SD-WAN与传统WAN的区别

近年来&#xff0c;许多企业选择了SD-WAN作为他们的网络解决方案。云基础架构的SD-WAN不仅具备成本效益&#xff0c;而且提供更安全、更可靠的WAN连接&#xff0c;有助于实现持续盈利。客户能够更好地控制他们的网络&#xff0c;个性化定制且无需额外成本。 那么&#xff0c;为…

服务器数据恢复—raid故障导致部分分区无法识别/不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌DL380服务器中3块SAS硬盘组建了一组raid。 服务器故障&#xff1a; RAID中多块磁盘出现故障离线导致RAID瘫痪&#xff0c;其中一块硬盘状态指示灯显示红色。服务器上运行的数据库在D分区&#xff0c;备份文件存放在E分区。由于RAID瘫…

[信号与系统]模拟域中的一阶低通滤波器和二阶滤波器

前言 不是学电子出身的&#xff0c;这里很多东西是问了朋友… 模拟域中的一阶低通滤波器传递函数 模拟域中的一阶低通滤波器的传递函数可以表示为&#xff1a; H ( s ) 1 s ω c H(s) \frac{1}{s \omega_c} H(s)sωc​1​ 这是因为一阶低通滤波器的设计目标是允许低频信…

05-java基础——循环习题

循环的选择&#xff1a;知道循环的次数或者知道循环的范围就使用for循环&#xff0c;其次再使用while循环 猜数字 程序自动生成一个1-100之间的随机数&#xff0c;在代码中使用键盘录入去猜出这个数字是多少&#xff1f; 要求&#xff1a;使用循环猜&#xff0c;一直猜中为止…

时序预测 | Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测&#xff1b; 2.多变量时间序列数据集&#xff08;负荷数据集&#xff09;&#xff0c;采用前96个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&…

品牌为什么需要3D营销?

在对比传统品牌营销手段时&#xff0c;线上3D互动营销以其更为生动的展示效果脱颖而出。它通过构建虚拟仿真场景&#xff0c;创造出一个身临其境的三维空间&#xff0c;充分满足了客户对实体质感空间的期待。不仅如此&#xff0c;线上3D互动营销还能实现全天候24小时无间断服务…

PyTorch中“No module named ‘torch._six‘“的报错场景及处理方法

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 在使用PyTorch时&#xff0c;您可能会遇到"No module named ‘torch._six’"的错误。这通常是因为PyTorch的某些…

来自工业界的知识库 RAG 服务(五),模块化知识库 GoMate 实现方案详解

背景介绍 很早以前就看过一篇介绍 RAG 的综述性文章 Retrieval-Augmented Generation for Large Language Models: A Survey, 其中介绍了 RAG 的模块化架构&#xff1a; 但是一直没有看到对应的实现方案&#xff0c;以前也没有理解此框架的优势之处。随着在相关领域的持续实…

门店通微信小程序系统源码

&#x1f4f1;&#xff1a;便捷购物新选择 &#x1f3e2;一、什么是门店通微信小程序&#xff1f; 随着移动互联网的快速发展&#xff0c;微信小程序成为了我们日常生活中不可或缺的一部分。门店通微信小程序是一款集合了多家门店信息、服务、优惠等功能于一体的工具&#xf…