阴影的基本原理

news2024/11/24 3:08:21

1、现实中阴影的产生规则

如图所示,现实中的阴影产生规则是,在不考虑光线反射的前提下,当一个光源发射的一条光线遇到一个不透明物体A时,这条光线就不能够再继续照亮其他物体了(物体B的一部分),相当于光线被更靠近光源的A物体挡住了一些,这时物体A就会向旁边的物体B投射阴影,也就是说阴影区域的产生就是因为光线无法到达

2、Shadow Mapping技术

基于 阴影区域的产生就是因为光线无法到达 的这个规则,Lance Williams(兰斯·威廉姆斯)在1978年时最早提出了 Shadow Mapping (阴影贴图)技术。,这是计算机图形学中第一个提出的通用阴影算法。
Shadow Mapping 的基本原理:将摄像机的位置放在和光源重合的位置上,那么场景中关于这个光源的阴影区域就是摄像机看不到的位置

注意:一般情况下,点光源用透视投影,平行光用正交投影

Shadow Mapping (阴影贴图)技术在Unity中的本质其实就是生成一张深度图(阴影映射纹理),一般存于显存中,这张深度图记录了从该光源位置出发,能看到的场景中距离它最近表面的位置(一般记录其深度信息,值转换为0~1之间,0最近,1最远)

Shadow Mapping 阴影贴图技术就是将摄像机的位置放在和光源重合的位置上,场景中关于这个光源的阴影区域就是摄像机看不到的位置。它会生成一张深度图(阴影隐射纹理),一般存于显存中。记录了从该光源位置出发,能看到的场景中距离它最近表面的深度信息(0~1之间,0最近,1最远)

3、Unity中如何应用Shadow Mapping技术

阴影映射纹理的生成是由光源完成的。

在每帧渲染的早期阶段,Unity会对每个能够投射阴影的光源创建一个对应的摄像机视角,这个视角用于捕获从光源位置看到的场景。平行光设置为正交摄像机,点光源可能会设置多个视角,捕获多个方向的立方体阴影贴图。
Unity会渲染场景的深度信息,这些深度信息表示从光源到场景中每个物体的距离,不考虑颜色信息,最终存储在显存中。
实时阴影映射纹理需要每帧更新,但对于静态光源和静态场景,可以使用预烘焙的阴影贴图,减少实时计算的开销。

有了 阴影映射纹理 后,我们只需要在Pass中将顶点位置变换到光源空间下,得到顶点在光源空间下的三维位置信息。然后使用X和Y分量对阴影映射纹理进行采样,得到阴影纹理中该位置的深度信息。如果阴影纹理中取出的深度值小于该顶点的深度值,那么说明该顶点位于阴影中。(深度图中值为0~1之间,0最近,1最远)

4、Screen Space Shadow Mapping 技术

在Unity当中,使用的并不只是纯粹的Shadow Mapping技术还会使用由微软研究院提出的 (首次提出是在2011年)Screen Space Shadow Mapping( SSSM ),翻译过来就是:屏幕空间阴影映射技术,它是基于Shadow Mapping 技术的一种拓展和改进技术。

注意:并不是所有设备都支持SSSM技术,在之后编写阴影相关Shader时,Unity内部会帮助我们判断对应平台是否支持,不支持时会默认使用Shadow Mapping处理阴影

SSSM(屏幕空间阴影映射技术)基于 Shadow Mapping 技术的基础上需要多生成一张深度图 —— 屏幕空间深度图

在屏幕空间阴影映射技术中,会和 Shadow Mapping 一样为每个光源生成对应的阴影映射纹理(从光源视角生成)。并且还会生成一张屏幕空间深度图

这张屏幕空间深度图中记录了从摄像机视角看到的每个像素的深度值(即每个像素点到相机的距离)更确切的说是每个像素点对应的场景中的顶点离摄像机的深度值(深度值0~1之间, 0表示离摄像机近裁剪面最近的距离,1表示摄像机远裁剪面 也就是最远的距离)

当有了 阴影映射纹理屏幕空间深度图后,我们将利用他们携带的信息来决定最终的阴影效果。其中一件非常重要的事,就是坐标转换
我们需要把 屏幕空间的像素位置 变换到 光源空间下,然后在 光源空间 下 比较每个像素的深度值 和 阴影映射纹理中的值,如果当前像素的深度值大于光源深度图中的值,说明该像素在阴影中。

注意:当屏幕空间中的像素位置变换到光源空间下时,可能不在光源空间的可见范围内,这时我们无需进行比较判断,该像素不用进行阴影处理

SSSM(屏幕空间阴影映射技术)的原理:

  1. 基于光源位置生成的 阴影映射纹理
  2. 基于渲染游戏画面时得到的 屏幕空间深度图
  3. 将屏幕像素位置 变换到 光源空间下
  4. 对 屏幕空间深度图 和 阴影映射纹理 进行采样 比较深度值,决定最后的阴影处理效果

5、Unity中如何实现阴影

Unity会调用 LightMode(灯光模式)被设置为 ShadowCaster(阴影投射器)的 Pass (渲染通道)来生成对应的阴影映射纹理(Shadow Mapping技术),以便在后续的阴影计算中使用
阴影映射纹理的计算过程往往不需要我们手动处理,Unity中提供了对应的阴影相关的宏帮助我们进行计算,直接调用它们即可

注意:如果Shader中没有LightMode为ShadowCaster的Pass,会在Shader中的Fallback指定的
Shader中继续寻找,直到找到对应Pass。如果没有找到,那么该物体就无法向其他物体投射阴影,因为阴影映射纹理计算中就不会计算该物体的信息。(但是该物体仍可以接收其他物体的投影)

而对于 支持SSSM(屏幕空间阴影映射技术)的设备来说,除了 阴影映射纹理外,还需要屏幕空间深度图。而屏幕空间深度图通常由摄像机在渲染过程中自动生成,并存储在摄像机的深度纹理中
我们只需要在计算时从光源的阴影映射纹理 以及 屏幕空间深度图 中进行采样比较深度即可

同样这个过程往往不需要我们手动处理,Unity中提供了对应的阴影相关的宏帮助我们进行计算,我们直接调用它们即可

需要注意的是,物体接收来自其他物体的阴影 和 物体向其它物体投射阴影 是两个过程:
(1)物体接收来自其他物体的阴影
必须在Shader中对阴影映射纹理(SM或SSSM中的阴影图)进行采样,把采样结果和最后的光照结果相乘来产生阴影效果

(2)物体向其它物体投射阴影
必须将该物体加入到光源的阴影映射纹理的计算中,必须要有LightMode(灯光模式)被设置为ShadowCaster(阴影投射器)的 Pass (渲染通道),这样才能让其他物体在对阴影映射纹理采样时,得到该物体的相关信息。

想要让 物体接收来自其他物体的阴影物体向其它物体投射阴影
我们需要在Unity中对光源和物体进行一些设置:

  1. 保证光源能够生成阴影映射纹理 —— 光源组件上设置 Shadow Type(阴影类型)
  2. 保证物体能接收其他物体的阴影 —— 网格渲染器组件上勾选 Receive Shadows(接收阴影)
  3. 保证物体向其它物体投射阴影 —— 网格渲染器组件上设置 Cast Shadows(投射阴影)

想要在Unity中实现阴影效果,必须注意以下三点:

  1. 对光源 以及 物体进行相关设置,让光源开启阴影,让物体能够投射和接收阴影
  2. 想要向其它物体投射阴影的物体 Shader 中,必须要有LightMode被设置为ShadowCaster的Pass,才能在阴影映射纹理中记录自己的信息
  3. 想要接收其他物体投射的阴影的物体 Shader 中,必须对阴影映射纹理进行采样,用于最后的光照计算

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

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

相关文章

ChatGPT 向更多用户推出高级语音模式:支持 50 种语言;字节发布两款新视频生成大模型丨 RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

AutosarMCAL开发——基于EB MCU驱动

这里写目录标题 1.MCU模块的作用2.EB配置以及接口应用3.总结 1.MCU模块的作用 MCU模块主要分为三部分: McuGeneralConfiguration MCU通用配置(一般保持默认)McuHardwareResourceAllocationConf 硬件资源分配管理器(用于连接不同…

TEDxDUTH 使用 NocoBase 实现革新

作者:TEDxDUTH TEDxDUTH 是由德莫克里特大学的志愿者们组成的一个充满活力的团队。作为 TEDx 全球社区的一员,我们的使命简单而有力:传播能够激励和引发改变的思想。我们通过精心策划一系列活动,成功汇聚了众多思想家、创新家以及…

Module did not self-register: ‘drivelist.node‘报错解决

报错如下: node_modules/bindings/bindings.js:121throw e;^Error: Module did not self-register: xxxx/node_modules/drivelist/build/Release/drivelist.node.at process.func [as dlopen] (electron/js2c/asar.js:140:31)at Object.Module._extensions..node (…

探索 Python 中的 AI 魔法:markdownify 库的奥秘

文章目录 探索 Python 中的 AI 魔法:markdownify 库的奥秘背景:为何选择 markdownify?库简介:markdownify 是什么?安装指南:如何安装 markdownify?函数用法:markdownify 的五个简单函…

【Qwen2-VL】通义多模态新作速读

Qwen2-VL https://github.com/QwenLM/Qwen2-VL 结构: 整体:6.75 亿个参数的 Vision Transformer (ViT) (Dosovitskiy et al., 2021) Qwen2 预处理阶段: 朴素动态分辨率支持&…

工程车辆目标检测、工程车检测算法、工程车辆类型检测算法

工程车检测算法主要用于智能交通系统、建筑工地管理、矿山开采、物流运输等领域,通过图像识别技术来检测和识别工程车,以提高安全管理、交通流量管理和资源调度的效率。以下是关于工程车检测算法的技术实现、应用场景及优势的详细介绍。 一、技术实现 工…

VRP-SAM

不建议复现

uni-app - - - - - 小程序获取宿主语言

const systemInfo uni.getSystemInfoSync(); console.log(systemInfo);uni.showModal({title: 宿主语言,content: systemInfo.hostLanguage })官网地址:【uni-app getSystemInfoSync】

西圣Mike Pro无线麦克风强势上线!百元级实力口碑与销量双冠王!

随着音频技术的不断革新与飞跃,西圣XISEM再次以卓越的创新驱动力推出全新力作,近日,西圣品牌震撼发布全新专业无线麦克风——西圣Mike Pro。用行业领先的硬件配置,百元价格打造千元专业级麦克风专业体验,音质远超同价位…

1分钟学会BCT环境搭建和网络配置 (24年9月25日更新)

又开始弄AirPlay了,在之前基础上更新下如何配置BCT环境和网络 如何配置apple 路由器在之前的文章有教,在这里就不陈述了 传送门:【BCT认证】Bonjour Conformance Test教程 1、apple路由器怎么接? 2、命令怎么输入? IPv4 sudo ./BonjourConformanceTest -I en4 -L -DD -…

拆解一个有问题的索爱GK6蓝牙耳机,蓝牙连接中的一些软硬件问题

由来 经常带入耳式蓝牙,倒是耳朵有时候难受,无意间看见网上的夹耳式耳机,想要尝试一下。但毕竟好点儿的太贵,主要想了解内部结构,所以淘到两个电子垃圾 拆解充电仓 这个只能暴力一点儿,需要拆坏一个卡扣…

记某地级市护网的攻防演练行动

0x1 前言 哈喽,师傅们! 这次给师傅们分享的是上上个星期的地级市护网的攻防演练的两个案例,涉及到的知识点可能比较偏,下面我也会提前给师傅们拓展下改漏洞相关的知识点内容。护网攻防演练中,涉及到的很多敏感内容这…

古代经典名方目录数据库-支持经典名方检索!

"古代经典名方目录"是指一系列历史上流传下来的,被认为具有一定疗效的中药方剂的汇总。这些方剂多来源于历代医学典籍,经过长期临床实践的检验,部分已被收录于官方的目录之中,以便于现代医疗实践中的参考和应用。 目前…

安科瑞光伏发电并网柜防孤岛保护装置---微机保护测控装置

安科瑞戴婷 Acrel-Fanny 安科瑞光伏发电并网柜防孤岛保护装置微机保护测控装置(以下简称装置)集保护、控制、测量、通讯和监视功能于一体,资源丰富、配置完善、维护方便、性能稳定,适用于 35kV 及以下电压等级电力系统的保护和测…

投资气膜场馆:开启未来体育发展的新纪元—轻空间

随着对体育设施建设的重视,气膜场馆作为一种创新的体育设施,正日益成为投资的热门选择。气膜场馆凭借其独特的优势和多重好处,不仅能提升体育场馆的功能性和经济性,更为地方经济发展注入了新的活力。 成本效益显著 气膜场馆具有快…

闲盒支持的组网方式和注意事项

1. 直连光猫拨号​ 通过光猫拨号,设备直连光猫的设备,需要对光猫开启UPNP并关闭DMZ 如果只接一个盒子,建议直接针对盒子IP开dmz。 2. 直连路由器​ 通过路由器拨号,设备直连路由器的设备,需要对路由器开启UPNP并关闭…

如何在O2OA中使用ElementUI组件进行审批流程工作表单设计

本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计,O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操作。 在流程表单设计界面,可以在左边的工具栏找到Ele…

Fyne ( go跨平台GUI )中文文档- 数据绑定 (六)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

基于GPU的Julia集应用程序

配置好CUDA编译环境之后,vs创建一个CUDA的项目,会自动包含一个.cu文件,可以在当前文件中编写。 因为当前的项目需要用到其他的头文件和库,需要加入对应的路径,这个和别的工程是一样的。 1. 头文件目录 2. 库文件目录…