阴影的基本原理

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.rhkb.cn/news/433091.html

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

相关文章

等保2.0数据库测评之达梦数据库测评

一、达梦数据库介绍 达梦数据库管理系统属于新一代大型通用关系型数据库,全面支持 ANSI SQL 标准和主流编程语言接口/开发框架。行列融合存储技术,在兼顾 OLAP 和 OLTP 的同时,满足 HTAP 混合应用场景。 本次安装环境为Windows10专业版操作…

Docker:解决开发运维问题的开源容器化平台

云计算de小白 Docker是一个开源的容器化平台,可以将应用程序及其依赖的环境打包成轻量级、可移植的容器。 Docker为什么这么受欢迎呢?原因很简单:Docker可以解决不同环境一致运行的问题,而且占用资源少,速度快。 所以好的东西…

erlang学习:Linux命令学习6

for循环学习 打印九九乘法表 for i in {1..9};do %%取1-9for j in $(seq 1 $i);do %%取1-iecho -n "$j*$i$((i*j)) " %%进行九九乘法表打印doneecho done尝试了很多次报错是因为后面的换行符不对,window系统中的换行符与linux对不上,因…

Spring Boot 快速入门教程

1. Spring Boot 简介 Spring Boot 是一个基于 Spring 框架的项目,它简化了基于 Spring 的 Java 应用程序的创建和部署。Spring Boot 通过提供一系列的“Starters”来简化 Maven 配置,同时使用约定大于配置的原则,让开发者能够以最少的配置启…

李沐深度学习-多层感知机、模型选择、过拟合、欠拟合

3.8.1 隐藏层 多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。隐藏层位于输入层和输出层之间。图3.3展示了一个多层感知机的神经网络图,它含有一个隐藏层,该层中有5个隐藏单元。 图3.3 带有隐藏层的多层感…

Windows环境部署Oracle 11g

Windows环境部署Oracle 11g 1.安装包下载2. 解压安装包3. 数据库安装3.1 执行安装脚本3.2 电子邮件设置3.3 配置安装选项3.4 配置系统类3.5 选择数据库安装类型3.6 选择安装类型3.7 数据库配置3.8 确认安装信息3.9 设置口令 Oracle常用命令 2023年10月中旬就弄出大致的文章&…

铨顺宏科技携RTLS+RFID技术亮相工博会!

中国国际工业博览会盛大开幕! 铨顺宏科技展亮点速递 铨顺宏科技展位号:F117 中国国际博览会今日开幕,铨顺宏科技携创新产品亮相,吸引众多参观者。 我们珍视此次国际盛会,将全力以赴确保最佳体验。 工作人员热情解答…

深度剖析OnlyFans:超越AI的盈利模式与未来挑战

引言 近年来,OnlyFans以其惊人的收入水平震惊了硅谷,2022年的66亿美元营收远超OpenAI的34亿美元。本文将深入探讨OnlyFans的成功原因、商业模式以及面临的AI挑战,试图揭示其在付费内容生态中的独特地位。 OnlyFans的商业模式 OnlyFans成立…

Solidity——抽象合约和接口详解

🚀本系列文章为个人学习笔记,目的是巩固知识并记录我的学习过程及理解。文笔和排版可能拙劣,望见谅。 Solidity中的抽象合约和接口详解 目录 什么是抽象合约?抽象合约的语法接口(Interface)的定义接口的语…

MySQL_插入、更新和删除数据

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :&#x1…

使用Electron打包一个Vue3项目全步骤

1.创建一个Vue3项目 2.使用 WebStorm打开项目,并安装依赖项 npm install 等待完成后, 安装electron npm install --save-dev electron 等待完成后, 安装electron 打包依赖项(打包成可执行文件) npm install electron-packager --save-dev 3…

【大模型-驯化】成功解决载cuda-11.8配置下搭建swift框架

【大模型-驯化】成功解决载cuda-11.8配置下搭建swift框架 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 相关内容文档获取 微信公众号 &…

油气田可视化管理:精准监测与高效生产

通过图扑可视化技术实时监测油气田运行数据,优化生产流程,提高资源利用率和安全性,实现精准化管理。

如何在谷歌浏览器上玩大型多人在线游戏

在如今的数字时代,谷歌浏览器已经成为了许多人上网冲浪的首选工具。除了浏览网页、观看视频之外,你还可以在谷歌浏览器上畅玩各种大型多人在线游戏。本文将为你详细介绍如何在谷歌浏览器上玩大型多人在线游戏的步骤。 (本文由https://chrome…

AWS Network Firewall - 配置只应许白名单域名出入站

参考链接 https://repost.aws/zh-Hans/knowledge-center/network-firewall-configure-domain-ruleshttps://aws.amazon.com/cn/blogs/networking-and-content-delivery/deployment-models-for-aws-network-firewall/ 1. 创建防火墙 选择防火墙的归属子网(选择公有…

WinForm程序嵌入Web网页

文章目录 前言一、三方库或控件的选择测试二、Microsoft Edge WebView2安装、使用步骤1.安装2.使用 前言 由于此项目需要winform客户端嵌入web网页并于JAVA端交互数据,所以研究了一下嵌入web网页这部分,趟了一遍雷,这里做下记录。 一、三方库…

C# 委托(Delegate)二

一.委托的多播(Multicasting of a Delegate): 委托对象,使用 "" 运算符进行合并,一个合并委托调用它所合并的两个委托。使用"-" 运算符从合并的委托中移除组件委托。 注:只有相同类型…

微服务-流量染色

1. 功能目的 通过设置请求头的方式将http请求优先打到指定的服务上,为微服务开发调试工作提供便利 请求报文难模拟:可以直接在测试环境页面上操作,流量直接打到本地IDEA进行debug请求链路较长:本地开发无需启动所有服务&#xf…

[附源码]网上订餐系统+SpringBoot+前后端分离

今天带来一款优秀的项目:网上订餐系统源码 。 系统采用的流行的前后端分离结构,包含了“管理端”,“商家管理端”,“用户购买端” 如果您有任何问题,也请联系小编,小编是经验丰富的程序员! 一.…

【Python语言初识(五)】

一、文件和异常 在Python中实现文件的读写操作其实非常简单,通过Python内置的open函数,我们可以指定文件名、操作模式、编码信息等来获得操作文件的对象,接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件&#…