[计算机图形学]光线追踪前瞻:阴影图(前瞻预习/复习回顾)

news2025/4/13 12:24:12

一、前言

我们前面学习过了光栅化,而光栅化会有一系列问题,比如:全局的光线传输阴影。我们之前讲着色的时候说了,我们认为着色是一个局部的操作,我们只考虑着色点本身,并不考虑其它物体的遮挡对着色点的影响,而这是不正确的,这导致了我们并不能通过着色来呈现阴影。而人们通过一种叫做阴影图/阴影映射(英文Shadow Mapping,对应的结构叫做Shadow Map)的方法使得即使是在光栅化中也能呈现阴影。

二、Shadow Mapping

首先,Shadow Mapping是一种基于图像空间的做法,也就是说我们并不需要知道场景中的几何信息。其次,Shadow Mapping 会产生阴影的走样问题。Shadow Mapping的一个重要思想:如果一个点不在阴影中,那么说明摄像机可以看到这个点,并且光源也可以看到这个点。如果一个点在阴影中,那么说明摄像机可以看到这个点,但是光源看不到这个点。此外要说明的一点是,传统的Shadow Mapping只能处理点光源/方向光源,这种光源产生的阴影一般会有明显的边界,也就是硬阴影,也就是说一个点要么在阴影中,要么不在阴影中,非0即1的一个过程。

过程1:

Shadow Mapping的第一步是先从光源出发,可以理解为在光源处放置了一个虚拟摄像机,然后对整个场景做一遍光栅化,通过我们前面提到的深度缓冲我们可以得到从光源出发看到哪些点。由此我们可以得到一幅图,但是不对这幅图着色,而是把看到点对应的深度记录下来。

过程2:

第二步,我们从真正的摄像机出发,如果我们观察到一个点,我们做一次投影,把它投影回到从光源出发的虚拟摄像机的平面上,就可以得到看到的那个像素的之前记录下的深度,与此同时我们计算摄像机观察点到光源的距离,如果和前面记录的深度相等,这就说明该点不应该存在阴影,因为眼睛和光源都可以观察到,如上图中橙色线标注的观察点。

相反的,如果计算得到的观测点到光源的距离和之前记录的深度值不相等,则说明该点在阴影中,因为光源看不见该点。

有阴影(左)和无阴影(右)的比较

流程图:

 从光源出发观察光栅化得到的深度图

 相机观察点投影回光源的距离和记录深度比较后的结果图

阴影图的问题:

从上面的图我们看得出,我们得到的图非常脏,这是浮点数的精度问题,在实际场景中,我们判断我们投影回的距离和深度相等是非常困难的,包括:投影回的像素包含不止一个观察点,且浮点数很难判断相等。人们尝试不用相等,而是定义如果我们实际投影回的距离大于之前记录的深度,就判定该点在阴影中,但还是存在问题,因为有一些特别接近的值无法判断,像1.00001这种,于是人们又引入了一个偏差量,也就是不能只判断实际距离大于记录深度,还要大于记录的深度加上偏差量。但实际上这些方法本质上仍然不能解决所有的问题。

另外一个问题,我们从光源视角得出的深度图是有分辨率的,如果这张深度图分辨率特别低,就会导致阴影的走样,我们会看到场景中的阴影有很严重的锯齿,当然我们可以使用更高分辨率的阴影图,但是这就会造成更大的性能开销。

还有,我们前面提到的,传统的阴影图并不能解决硬阴影问题,当然阴影图在今天经过人们的不懈努力已经能解决硬阴影的问题了。当然,通过传统光栅化的办法做全局的光照仍然非常困难。

而软阴影是如何产生的呢?它的存在是因为光源有一定的大小,如上图中的日蚀示意图,图中地球上产生了本影(Umbra)半影(Penumbra),落在本影区域的人完全看不见太阳,而落在半影区域的人可以看到太阳的一部分。软阴影的边缘相对硬阴影来说比较柔和。而通过上面的解释我们也可以得知,点光源是不可能产生软阴影的。

三、总结

通过介绍阴影图,我们得知了传统光栅化在有些方面是非常难做的,阴影,全局光照。而下一部分我们讲到的光线追踪都能对这些问题有更好的解决办法,包括光线追踪产生的代价,都会在之后一一介绍。

参考:

Lecture 12 Geometry 3_哔哩哔哩_bilibili​​​​​​​

GAMES101_Lecture_12 (ucsb.edu)

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

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

相关文章

3Dconnexion SpaceMouse Enterprise 企业版有线3D鼠标

3Dconnexion SpaceMouse Enterprise 企业版有线3D鼠标 企业版有线3D鼠标SpaceMouse Enterprise凭借六自由度(6DoF)传感器,以及标准和自定义快速视图的一键访问功能,你可以比以往更加轻松自如地查看3D模型。轻轻操纵控制帽即可流畅…

表白墙 - 进阶(MySQL版本) - 持久化存储

想要解决上面那个版本存在的问题:服务器重启,数据不丢失。 最好的办法:将数据存储到硬盘上。 存储的方式: 1、直接使用 流对象 写入文本文件 2、借助数据库 我们采取的方式:是 MySQL 数据库的方式 来实现 持久化存储。…

Python卷积详解

文章目录 卷积函数对比测试卷积应用 卷积函数 python提供了多种卷积方案,相比之下,定义在ndimage中的卷积函数,在功能上比numpy和signal中的卷积要稍微复杂一些,这点仅从输入参数的多少就可略窥一二 numpy.convolve(a, v, modef…

拥抱汽车行业新时代,移远通信着力打造“七大产品技术生态”

汽车市场和消费者的需求正在发生日新月异的变化。以往中国新能源汽车的推广,大多倚重政策补贴,而如今新能源汽车已经走过了这个阶段,开始变成消费者自愿选择。除了汽车的电动化,“智能化”是不少车型拨动消费者心弦的另一主要因素…

光学仿真小作品集

光学仿真小作品集 传播方向与 z 轴平行的二维平面波自由空间中的传输传播方向与 z 轴有一定夹角的二维平面波自由空间中的传输 本文将展示一些作者本人平时自制的光学仿真小作品。 传播方向与 z 轴平行的二维平面波自由空间中的传输 传播方向与 z 轴有一定夹角的二维平面波自由…

(九)【软件设计师】计算机系统-浮点数习题

文章目录 一、2009年下半年第3、4题二、2011年上半年第5题三、2012年下半年第3题四、2015年上半年第1题五、2015年下半年第3题六、2016年下半年第3题七、2018年上半年第1题八、2020年下半年第3题 知识点回顾 (八)【软件设计师】计算机系统—浮点数 一、…

怎么使用AS推送项目到Github上,一文解决!

废话不多说,直接发车了!在android studio上推送项目到GitHub上有个基本可以解决所有推送失败问题的步骤,如下图: 路径:File —— Setting —— Version Control —— GitHub —— 加号,添加用户 上述步骤是…

河道船舶识别检测系统 python

河道船舶识别检测系统通过ppythonYOLOv5网络模型算法技术,河道船舶识别检测系统对画面中的船只进行7*24小时实时监测,若发现存在进行违规采砂或者捕鱼立即自动抓拍触发告警。与C / C等语言相比,Python速度较慢。也就是说,Python可…

mui.ajax

mui.ajax(http:xxxxxxxxxx/login,//请求的地址{data:{},//传给服务器的数据,一般在post请求中dataType:json,//服务器返回数据的格式;type:post,//HTTP请求类型;目前仅支持post/gettimeout:5000,//设置超时时间async:true,//是否异步&#xf…

应急照明和疏散指示系统在化工厂房中的设计与产品选型

【摘 要】《消防应急照明和疏散指示系统技术标准》(GB 51309-2018)的颁布,使应急照明和疏散指示的设计理念及设计方案发生了颠覆性的改变。化工企业在进行系统设计时也有其自身的特点及问题,现根据实际案例,解析化工企业应急照明和疏散指示系…

echrts 工程项目可视化

Echarts 常用各类图表模板配置 注意: 这里主要就是基于各类图表,更多的使用 Echarts 的各类配置项; 以下代码都可以复制到 Echarts 官网,直接预览; 图标模板目录 Echarts 常用各类图表模板配置一、工程项目可视化二、…

记录-new Date() 我忍你很久了!

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 大家平时在开发的时候有没被new Date()折磨过?就是它的诸多怪异的设定让你每每用的时候,都可能不小心踩坑。造成程序意外出错,却一下子找不到问题出处,那…

受安全威胁困扰的时代的可见性和人工智能

安全漏洞和事件以惊人的规律性发生,媒体报道的大人物,只是发生的实际数量的一小部分。 就在上周,横跨澳大利亚和新西兰的主要金融服务提供商 Latitude Financial 公布了影响其 1400 万客户的网络攻击和数据泄露的详细信息。 如果我们要确保…

一致性框架设计方案

补充组件依赖 前言 对于供应链业务,一般对数据一致性要求高。且由于业务复杂,可能会存在一个业务功能触发几个异步操作的场景,且要保证相关操作同时触发或不触发。 为了降低技术设计难度、代码编写难度,特意设计最终一致性框架&a…

Vue - 实现垂直菜单分类栏目,鼠标移入后右侧出现悬浮二级菜单容器效果(完整示例源码,详细代码注释,一键复制开箱即用)

前言 网上的教程都太乱了,各种杂乱无注释代码、图片资源丢失、一堆样式代码,根本无法改造后应用到自己的项目中。 本文实现了 在 Vue / Nuxt 项目中,垂直分类菜单项,当用户鼠标移入菜单后,右侧自动出现二级分类悬浮容器盒子效果, 您可以直接复制源码,然后按照您的需求再…

pyecharts从入门到精通-地图专题BMap-世界地图和中国城市地图

文章目录 参考安装与查看pyecharts地图实现-BMap案例演示案例演示-杭州热门旅行线路图拓展-pyecharts中BMap源码 参考 官方文档:https://pyecharts.org/#/zh-cn/quickstart Bmap - Hiking_trail_in_hangzhou 安装与查看pyecharts 安装pyecharts pip install pyecharts2.0.3…

傅里叶级数FS,连续时间傅里叶变换CTFT,离散时间傅里叶变换DTFT,离散傅里叶变换DFT,推导与联系(二)

由于本文公式所占用的字符比较多,无法在一篇博客中完整发布,所以将其分为两篇博客。本篇主要介绍了离散傅里叶变换 DFT 的内容,以及相关的总结。对于前置内容,包括傅里叶级数 FS,连续时间傅里叶变换 CTFT,以…

【小程序】手动实现switch开关中带文字效果(开关左右文字相同/不同都可以)

最终效果&#xff1a; 左右文字宽度相同 左右文字宽度不同 左右长度相同 效果&#xff1a;配合wx:show切换 注意&#xff1a;左右长度相同的话可以设置合适的相同的宽度。 html&#xff1a; <view class"switch"><viewclass"switchNums {{ swi…

什么是Web1.0时代、Web2.0时代、Web3.0时代?

什么是Web1.0时代、Web2.0时代、Web3.0时代&#xff1f; 互联网的起源。1969年美国的阿帕网的出现标志着互联网的诞生&#xff0c;而1973年第一台个人电脑The Xerox Alto的出现就预示了互联网将蓬勃生长&#xff0c;随之而来的就是我们迈入了信息时代。短短几十年的发展&#x…

【服务器数据恢复】Storwize存储上的Oracle数据库数据恢复案例

服务器数据恢复环境&#xff1a; IBM Storwize某型号存储&#xff0c;共10块磁盘&#xff0c;组建了2组Mdisk加入到一个存储池中&#xff0c;创建了一个通用卷存放数据&#xff0c;存放的数据包含oracle数据库。 服务器故障&#xff1a; 存储中其中一组Mdisk有两块磁盘出现故障…