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

news2024/11/24 10:53:54

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

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深度缓存无法处理透明物体

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

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

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

相关文章

出现 Error creating bean with name xxx defined in class 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法4. Demo1. 问题所示 此类问题来自私信,本着探究问题的缘由,理性分析了下,让大家也学会分析Bug解决Bug 问题如下所示: Error creating bean with name xxx defined in class截图如下所示: 2. 原理分析 通用的原理进行分析 出现…

【C语言初阶】数组

🌟博主主页:我是一只海绵派大星 📚专栏分类:C语言 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、一维数组的创建和初始化 1、数组的创建 1.1数组的创建方式 1.2数组创建的实例 2、数组的初始化 二、一维数组的使用…

vue.js+node.js+mysql在线聊天室源码

vue.jsnode.jsmysql在线聊天室源码 技术栈:vue.jsElement UInode.jssocket.iomysql vue.jsnode.jsmysql在线聊天室源码

word怎么单页横向设置(页码不连续版)

打开word,将光标放在第一页的最后位置。 然后点击布局下的分隔符,选择下一页。 将光标放在第二页的开头,点击布局下的纸张方向,选择横向即可。 效果展示。 PS:如果那一页夹在两页中间,那么在…

基于C#开发web网页管理系统模板流程-主界面密码维护功能完善

点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言 紧接上篇->基于C#开发web网页管理系统模板流程-主界面统计功能完善-CSDN博客 一个合格的管理系统,至少一定存在一个功能——用户能够自己修改密码,理论上来说密码只能有用…

上位机图像处理和嵌入式模块部署(h750 mcu串口命令处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面学习103和407的时候,当时学过串口的收发。不过当时使用的主要是阻塞的方式。这一次,我们看下应该怎么利用中断的形式进…

互联网时代:挑战与机遇并存

随着科技的飞速发展和互联网的广泛普及,我们已然踏入了一个以信息为主导的互联网时代。这个时代以其鲜明的特点,正在深刻地改变着我们的生活方式、工作节奏以及社会交往模式。而如此深刻的社会变革,也引发了人们对于互联网时代所带来的挑战与…

计算机毕业三年的我,辞职两次后找不到工作回家,此时是真的羡慕有手艺在手的人

栀子花香,弥漫在空气中,却掩盖不了内心的苦涩。 半年,两份工作,两次裸辞,我,又成了一个身无分文的“废人”。 曾经,我也是人人羡慕的互联网人,月薪6K,过着“955”的“神…

【DevOps】Nginx配置文件详解与实战部署PHP站点

目录 引言 Nginx配置文件概述 基本结构 关键指令 Nginx配置文件实战 全局指令配置 HTTP指令配置 服务器指令配置 位置指令配置 实战部署PHP站点 步骤1:安装Nginx和PHP 步骤2:创建网站目录和文件 步骤3:配置Nginx服务器块 步骤4…

2024年金融、贸易与创意产业国际会议(ICFTCI 2024)

2024 International Conference on Financial Trade and Creative Industries 【1】大会信息 会议简称:ICFTCI 2024 大会地点:中国西安 投稿邮箱:icftcisub-paper.com 【2】会议简介 2024年金融贸易与创意产业国际会议即将召开&#xff…

果园预售系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,果树管理,果园管理,果园预约管理 前台账户功能包括:系统首页,个人中心,论坛,公告&a…

王炸! Suno史诗级更新,随便哼哼就能出一首好听的歌曲?

suno史诗级更新,随便哼哼就能出一首好听的歌曲? 就在今天,suno迎来史诗级更新! 先看截图! 来不及解释,我先试了一下,简直太牛了,先看看看效果,点开链接听歌! …

明星百科大全PHP网站源码

源码介绍 明星百科大全网站源码,国内外明星娱乐音乐、新闻八卦、写真照片、相关影视作品等等的明星百科网站源码。 源码截图 源码下载 明星百科大全PHP网站源码

day36| 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆

文章目录 前言860.柠檬水找零思路方法一 406.根据身高重建队列思路方法一 452. 用最少数量的箭引爆气球思路方法一 总结 前言 860.柠檬水找零 思路 很简单,贪心只有一个,如果20优先用105找零,因为5更加万能一些 方法一 class Solution(ob…

Python版本管理器-Miniconda

随着Python的版本更新,我们在开发Python软件的时候,对Python的版本选择越来越重要,但同时又要兼容已经开发好了的Python软件,因此选择一款合适的Python版本管理器对提高开发效率也越来越重要,今天就推荐一款Python的版…

登录/注册- 滑动拼图验证码(IOS/Swift)

本章介绍如何使用ios开发出滑动拼图验证码,分别OC代码和swift代码调用 1.导入项目model文件OC代码(下载完整Demo) 2.放入你需要显示的图片 一:OC调用 #import "ViewController.h" #import "CodeView.h"…

GStreamer应用程序——第一个应用程序

本章将总结您在前几章中学到的所有内容。它描述了一个简单的GStreamer应用程序的所有方面,包括初始化库、创建元素、将元素打包到管道中以及播放此管道。通过完成所有这些,您将能够构建一个简单的Ogg/Vorbis音频播放器。 Hello world 我们将创建一个简…

企业的crm客户管理系统的部署方式,是选私有云部署,还是公有云部署?

随着,现代化企业的发展,企业在选型CRM客户管理系统后,通过会选一种部署方式,然后才将其与企业现有的管理系统对接,那么一般企业在部署CMR客户管理系统时,一般会选哪种部署方式呢?是私有云crm部署…

PHP在线生成查询产品防伪证书系统源码

源码介绍 PHP在线生成查询产品防伪证书系统源码,源码自带90套授权证书模板,带PSD公章模板,证书PSD源文件。 环境要求:PHPMYSQL,PHP 版本请使用PHP5.1 ~5.3。 图片截图 源码安装说明 1.上传所有文件至你的空间服务器…

大文件word生成的处理与解决策略

前言 对于简单word文档的生成导出,java已经有着很多技术来进行处理,在有着相对固定的格式样板下,采用word模板导出相对会是比较好的选择。但是当数据量且包含大量图片后,采用模板导出就显得无力了,模板的缺点是无法应…