计算机图形学入门09:深度缓存

        在前面知道了怎么将一个三角形显示到屏幕上,那么如果有很多三角形,各自距离相机的远近也不一样,并且三角形会相互遮挡。也就是三维空间中有很多物体,通常近处的物体会遮挡住远处的物体,那么在计算机渲染中该如何处理呢?

1.画家算法

        灵感来至画家的绘画方式,这里的画是指油画,作画的时候先将远处的物体画在画布上,然后画中间的,最后才画最近的物体,近处画的物体会覆盖远处的物体。绘画完成后,会呈现出正确的遮挡关系,这就是画家算法(Painter's Algorithm)

        以计算机绘制立方体为例说明一下,绘制时,先绘制背后的面,接着绘制上下左右四个面,最后绘制前面的面,最终立方体呈现在屏幕中,遮挡关系符合预期。如下图左到右顺序所示:

        上图中上下左右四个面距离相机是一样的,先从左面开始,然后上面,刚好上面挡住了左面是正确的。但是,有个问题,如果先从上面开始再左边绘制,左面挡住了上面就不对了。所以画家算法只在一定程度上是可以的。

        画家算法虽然可以正确处理物体的遮挡关系,但是需要绘制之前先得到物体的远近关系,需要耗费一定的性能,这个问题是可以解决的,但是有一种特殊的情况画家算法无法正确处理。如下图所示:

        这种情况比上面提到的立方体先画上面再画左面的情况更复杂。如上图中所示有三个三角形互相遮挡,此时画家算法无法准确分辨谁在前面谁在后面,无法使用画家算法在计算机中绘制出正确的遮挡关系。

        既然以三角形(物体)为整体无法准确判断物体的遮挡关系,那可以更细一步,以屏幕中的像素为单位来判断物体的遮挡关系。这就是深度缓存(深度缓冲)或者Z-buffer

2.深度缓存

        在渲染出图像的同时,会生成另外一个图像,这个图像只存每个像素当前几何物体的最小z值(最近)信息,这个图像叫做深度图(Depth Map),也叫深度缓存(z-buffer)。而存储像素颜色的图叫做帧缓冲区(Frame buffer)这里为了简单,假设z值总是正的,z值越小物体越近,z值越大物体越远。如下图所示,左侧是渲染的图,右侧是深度图(值越小越黑),两张图都是同时生成的。

 2.1深度缓存的实现方法

        1.创建一个二维数组zBuffer[width][height],用来存放每个像素的深度,每个元素初始为一个比场景中最远物体的还大的z值(无限远)。
        2.遍历每个物体覆盖的每个像素,将映射到该像素上每个物体的z值跟zBuffer对应深度作比较,小于zBuffer对应的深度则将该值更新为新的zBuffer深度。

        代码如下:

        举个例子。如下图所示,一开始深度缓存中每个像素深度存无限大的值(R),将第一个红色三角形画到上面,每个像素深度为5(小于R),所以将红色三角形画到上面,并且更新像素深度缓存值。接下来蓝色三角形里的每个像素深度值与深度缓存中的深度值做对比,如果小于深度缓存中的值,那么更新对应像素深度值并且将蓝色画到上面,否则不变。

2.2算法复杂度

        在深度缓存中,假设有n个三角形,都覆盖常数项个像素,那就就是常数乘以三角形个数的复杂度,也就是O(n)的算法复杂度。

        但是怎么可能在线性时间内对n个三角形排序呢?就像前面画家算法对n个三角形排序,理论上对一组数据排序至少是O(n log(n))时间复杂度。因为深度缓存算法中并没有对n个三角形进行排序,只是在记录当前像素看到的最小值。

2.3注意事项

2.3.1顺序与z-buffer冲突

        在之前的例子中,假如先画蓝色三角形,再画红色三角形,得到的结果是一样的,也就是说深度缓存算法与物体先后顺序无关。

        那如果两个三角形在同一个像素上存在相同的深度缓存值呢(z-buffer冲突)?在图形学中,深度值一般是计算出的浮点型,两个浮点型相同基本上是不存在的,所以这里直接假设不存在两个三角形存在同一个像素里有相同的深度值。在实际3D引擎开发中深度重叠会出现闪面,需要手动调整物体位置。

2.3.2MSAA抗锯齿时深度缓存

        采用MSAA抗锯齿时,深度缓存是针对每个采样点,不在是针对像素进行深度比对,默认是每个像素保存一个深度,如果做MSAA抗锯齿时时2*2的盒子,那么每个像素需要保存4个深度值。

2.3.3深度缓存无法处理透明物体

        因为透明物体可以透过近处的物体看到远处的物体,所以不能通过深度值去判断,透明物体需要另外特殊的处理,不在本章讨论中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十四篇——互信息:相关不是因果,那相关是什么?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/499cd9af2ea14cbf8d12813f6f…

Linux命令详解(2)

文本处理是Linux命令行的重要应用之一。通过一系列强大的命令,用户可以轻松地对文本文件进行编辑、查询和转换。 cat: 这个命令用于查看文件内容。它可以一次性显示整个文件,或者分页显示。此外,cat 还可以用于合并多个文件的内容…

超全分析MybatisPlus中的MetaObjectHandler全局字段填充的基本知识(附Demo及实战)

目录 前言1. 源码及API2. Demo架构3. 全局字段填充(实战)4. 局部字段不填充(实战) 前言 对于Java的相关知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项…

nginx ws长连接配置

nginx ws长连接配置 http根节点下配上 map $http_upgrade $connection_upgrade {default upgrade; close;}如下: server服务节点下,后端接口的代理配置 proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connec…

电脑意外出现user32.dll丢失的八种修复方法,有效解决user32.dll文件丢失

遇到与 user32.dll 相关的错误通常是因为该文件已损坏、丢失、或者与某些软件冲突。今天这篇文章寄给大家介绍八种修复user32.dll丢失的方法,下面是一步步的详细教程来解决这个问题。 1. 重新启动电脑 第一步总是最简单的:重新启动你的电脑。许多小问题…

52.Python-web框架-Django - 多语言编译-fuzzy错误

目录 1.起因 2.原因 3.解决方法 3.1手动移除fuzzy标记 3.2重新生成po文件,并检查是否还存在fuzzy标记 3.3重新编译生成mo文件 1.起因 在Django的国际化和本地化过程中,当你发现某些字段仅显示msgid,而不显示msgstr时,可能是…

Python爬虫实战(实战篇)—18获取【小红书】首页信息写入Excel(仅用于学习-附完整版代码)

文章目录 专栏导读背景1、分析首页页面2、分析获取信息2-1,获取:笔记类型2-2,获取:标题2-3,获取:用户信息2-4,获取:用户ID2-5,获取:用户头像2-6,获取:文章连接完整代码总结专栏导读 文章名称链接Python爬虫实战(实战篇)—16获取【百度热搜】数据—写入Ecel(附完整…

日常销售数据分析为什么重要?三个维度全面分析日常销售数据

在当今电子商务的浪潮席卷全球的时代,网店如雨后春笋般涌现,并且竞争日趋激烈。在这样一个充满挑战与机遇的环境中,如何洞察市场动向,把握消费者需求,实现销售业绩的稳步增长,成为每一位电商运营者必须面对…

2024.6.12 作业 xyt

今日课堂练习&#xff1a;vector构造函数 #include <iostream> #include <vector> using namespace std;void printVector(vector<int> &v) {vector<int>::iterator iter;for(iterv.begin(); iter ! v.end(); iter){cout << *iter <<…

扩散模型会成为深度学习的下一个前沿领域吗?

文章目录 一、说明二、 第 1 部分&#xff1a;了解扩散模型2.1 什么是扩散模型2.2 正向扩散2.3 反向扩散 三、他们的高成本四、扩散模型的用处五、为什么扩散模型如此出色六、第 2 部分&#xff1a;使用扩散模型生成6.1 用于自然语言处理和 LLM 的文本扩散6.2 音频视频生成6.3 …

【APP移动端自动化测试】第一节.环境配置和adb调试工具

文章目录 前言一、Java环境搭建二、AndroidSDK环境搭建三、Android模拟器安装四、adb调试工具基本介绍 4.1 adb构成和基本原理 4.2 adb获取包名&#xff0c;界面名 4.3 adb文件传输 4.4 adb获取app启动时间 4.5 adb获取手机日志 4.6 adb其他有关…

空间搜索geohash概述;redis的geo命令

概述 通常在一些2C业务场景中会根据用户的位置来搜索一些内容。通常提供位置搜索的都是直接通过redis/mongodb/es等中间件实现的。 但是这些中间件又是怎么实现位置搜索的呢&#xff1b; 查了一番资料&#xff0c;发现背后一个公共的算法Geohash。 搜索的时候可以根据距离对…

「C系列」C 指针及其应用案例

文章目录 一、C 指针1. 指针的定义2. 指针的初始化3. 指针的解引用4. 指针的运算5. 动态内存分配6. 指针的NULL初始化7. 指针作为函数参数和返回值8. 指针数组和数组指针9. 多级指针 二、C语言中有哪些内置的指针操作符三、常见应用案例1. 交换两个变量的值2. 数组与指针3. 字符…

SwiftUI中自定义Shape与AnimateableData的使用

上一篇文章主要介绍了一下在SwiftUI中如何自定义Shape&#xff0c;本篇文章主要介绍Shape中的 一个关键的属性AnimatableData&#xff0c;它用于定义可以被动画化的数据。通过实现 Animatable 协议&#xff0c;可以让自定义视图或图形响应动画变化。 AnimatableData 是 Animata…

flutter 环境搭建(windows)(先装 jdk 建议1.8起步)

1&#xff1a;先从 官网 下载一个合适版本的SDK 2&#xff1a;下载完成之后 解压到一个合适的盘符下面&#xff08;本文在 D 盘 3.10.0版本&#xff09; 3&#xff1b;双击 flutter_console.bat文件可以看到一些基本信息 4&#xff1a;配置环境 1.添加用户变量 FLUTTER_STORAGE…

DSSA(Domain-Specific Software Architecture)方法论

DSSA&#xff08;Domain-Specific Software Architecture&#xff09;方法论是一种针对特定问题领域的软件架构设计方法。在软件开发中&#xff0c;有些问题在特定领域是共通的&#xff0c;这些问题可以通过通用的抽象和解决方案来处理。DSSA方法论正是利用这一特点&#xff0c…

Vue3、Element Plus使用v-for循环el-form表单进行校验

在开发中遇到了这样一个需求 有一个form是通过v-for生成出来的&#xff0c;并且数量不确定&#xff0c;每个表单中的字段都需要做校验&#xff0c;就将自己的解决方法记录了下来。 完整代码如下 <template><div class"for-form"><el-button type&quo…

Class-Aware Self-Distillation for Remote SensingImage Scene Classification

这篇文章提出了一种新的蒸馏方式&#xff0c;由于遥感场景图像具有类间相似性和类内多样性的特点&#xff0c;这篇文章试图解决这个问题。通过三个共享权重的分支&#xff0c;同时输入三张图片&#xff0c;其中两张类别相同的图片&#xff0c;一张类别不同但地物特征相似的图片…

AcWing 477:神经网络 ← 拓扑排序+链式前向星

【题目来源】https://www.acwing.com/problem/content/479/【题目描述】 人工神经网络&#xff08;Artificial Neural Network&#xff09;是一种新兴的具有自我学习能力的计算系统&#xff0c;在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。 对神经网络的研究…

179.二叉树:合并二叉树(力扣)

代码解决 /*** 二叉树节点的定义。* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, Tre…