前言

本文是对Unity中阴影实现原理的简单介绍,不涉及Shader实现细节。

文章目录

一.阴影的实现原理
1.1 简单的解释
1.2 实现原理
二.Unity中的阴影
2.1 阴影映射纹理,深度纹理,阴影纹理简介
2.2 阴影的投射与接收

一.实现原理

1.1简单的解释

假设下面这一张图是当前摄像机中呈现出的内容,不包含任何阴影。

阴影映射的原理是:采样上图中像素,获取像素在世界空间中的位置(对应了世界空间中的一个点),判断这个点是否能被光源“看见”。

如果这个点与光源连线中间没有被其它物体遮挡,则这个点在光中。
如果被遮挡,则这个点在阴影中。需要为这个点(像素)打上阴影。
对上图中像素遍历后打上阴影后的结果如下图。

1.2实现原理

关于“点与光源连线之间是否有物体遮挡”,我们通过类似深度缓冲的技术来实现。
我们在灯光位置设置一个假想的摄像机,并渲染从光线中看到的场景深度,
并将这些结果保存下来,得到阴影映射纹理(shadowmap)
光源的位置,通过假想摄像机得到的阴影映射纹理(shadowmap)见下图

阴影映射纹理(shadowmap)的每个像素都可以在世界空间中重新映射,并会告诉你光看到的像素以及该点与光源本身的距离。在上图中,如果我们采样阴影映射纹理(shadowmap)中P3/P2这一像素,我们实际可以获得的是世界空间中点P3到光源的距离。

让我们梳理一下整个过程:
对于上图中P1这个摄像机视角中的一个像素,我们采样这个像素获取其在世界空间中的位置(可以视为一个点),然后将这个点映射到阴影映射纹理(shadowmap)中,得到其在阴影映射纹理(shadowmap)中应对应的像素P1,然后采样阴影映射纹理(shadowmap)中P1这个点,获取光看到的像素以及该点与光源本身的距离。两者相等,点P1不在阴影中。
对于摄像机视角里的像素P2,,在映射到阴影映射纹理(shadowmap)后得到像素P3/P2,然后采样阴影映射纹理(shadowmap)中P3/P2这个像素获取到的值是世界坐标下P3到光源的距离,与世界坐标系下P2到光源的距离不相等。P2在阴影中。

二.Unity中的阴影

2.1阴影映射纹理,深度纹理,阴影纹理简介

在《Unity Shader入门精要》第九章有关阴影的内容中,作者提到了以下三个纹理
1.光源的阴影映射纹理
2.屏幕空间的深度纹理
3.屏幕空间的阴影纹理
用图片直观的认识这三张纹理有利于后续的理解
首先,以下是书中实验场景与最终渲染效果

1.光源的阴影映射纹理,也就是刚才说的shadowmap

2.屏幕空间的深度纹理
在延迟渲染里这张深度图(纹理)本来就有,如果是前向渲染的话就需要把场景整个渲染一遍,把深度渲染到深度图(纹理)中。

3.屏幕空间的阴影纹理
左图为阴影纹理,右图为最终渲染效果
作者在github对这张纹理做出了解释:获取这张纹理的主要思路就是从摄像机的深度纹理里采样得到该fragment的深度值,然后利用矩阵变换计算得到该点对应的世界空间的世界坐标(利用CameraToWorld矩阵),然后再变换到光源空间下的坐标(利用WorldToShadow矩阵),最后拿这个坐标对光源的ShadowMap采样计算阴影。最终将所有结果存储到一张阴影纹理中。
计算获取阴影纹理的总体思路和第一节中所述是一致的,不同之处在于,在进行比较时不是使用世界空间下点到光源的距离,而是使用了光源空间下点到光源的距离

2.2阴影的投射与接收

显而易见,阴影的产生需要光源,阴影投射体,与接收阴影的物体。
在本节例子中,立方体既向地面投射了阴影,又接收了来自立面的阴影。
在Unity中我们可以通过相关选项来控制物体的投射/接收阴影。如下图
作者在书中P198对投射阴影/接收阴影做出的解释大意为:如果物体开启了投射阴影属性,Unity就会把物体加入到光源的阴影映射纹理的计算中。其它物体在对阴影映射纹理进行采样时就会收到该物体的影响。
以第一节的图片举例:如果P3所在球体未开启投射阴影属性,那么右侧的阴影映射纹理中红框所示阴影圆块将不存在,阴影映射纹理中P3/P2存储的信息将是P2到光源的距离。P2在渲染时被映射到阴影映射纹理后采样阴影映射纹理得到的不再是P3到光源的距离,而是P2到光源的距离。二者相等,P2将被判断为不在阴影中。屏幕空间的阴影纹理中点P2处将不再有阴影。
下图演示了在帧调试器中,打开/关闭立方体的投射阴影选项对屏幕空间的阴影纹理的影响。
开启:
关闭:

关闭立方体的阴影投射最终渲染结果:

对于阴影的接收,无论物体是否开启,都不会影响屏幕空间阴影纹理的计算结果。在此不再举例。

参考文章1:Unity阴影和深度纹理的补充说明(重要)
参考文章2:延迟渲染阴影映射

【Unity——阴影实现基本原理】相关推荐

  1. Unity阴影(Shadow)、Shadowmap

    Unity阴影(Shadow) 在Unity中,阴影(Shadow)是用于模拟场景中物体之间相互遮挡和光照效果的特性.阴影可以增加场景的真实感,并在视觉上提供深度和空间感. Unity提供了几种阴影投 ...

  2. 2d shader unity 阴影_Unity中实现2D光照系统

    在一些 2D 游戏中引入实时光影效果能给游戏带来非常大的视觉效果提升,亦或是利用 2D 光影实现视线遮挡机制.例如 Terraria, Starbound. 2D 光影效果需要一个动态光照系统实现, ...

  3. 2d shader unity 阴影_【Unity Shader】平面阴影(Planar Shadow)

    来介绍一种适用于移动平台的高性能实时阴影解决方案--平面阴影(Planar Shadow). 由于Unity内置的实时阴影实现方式是屏幕空间阴影贴图(Screen Space Shadow Map)非 ...

  4. unity阴影(一)烘焙和Quality中Shadows的设置

    (1)unity的烘焙 1.光源的3种模式:RealTime,Mixed,Baked 2.烘焙设置中的LightMode:最重要的就是Shadowmask Mixed光源 + ShadowMask的L ...

  5. 2d shader unity 阴影_UNITY崩坏3角色渲染实践

    最近二次元手游,卡通渲染都挺火的.虽然公司没开这类型项目,但是渲染来玩一下也好,原理都是一样,比较简单. 在日式卡通中,<罪恶装备>.<崩坏3>的效果都很不错,都是几年前的产品 ...

  6. Unity 阴影频闪的问题

    树的影子,在场景中正常,在游戏视图中,一运行就疯狂频闪 开了两个Game视图,最终导致了问题的出现,保留一个就可以解决了 特别感谢这位大佬,半夜还在群里为素不相识的我解答疑惑 也希望这篇帖子能给有需要 ...

  7. Unity实时阴影实现图解

    2019独角兽企业重金招聘Python工程师标准>>> Unity大中华区技术支持团队近年来为国内Unity用户提供了高质量的技术支持服务,本文将由该团队的技术支持工程师张陈渊,根据 ...

  8. C# Unity编程终极指南

    使用现代Unity开发技术创建一个有趣的2D平台,掌握Unity引擎和C#编程 你会学到: 学习C#的基础知识.从变量."如果"语句到创建面向对象的结构.没有编程经验是必要的. 创 ...

  9. Doom 3 阴影算法简介

    [hotball技術小舖]Doom 3的打光系統簡介 (2004-10-21) 在本文中,會對Doom 3的打光系統中,最重要的兩個部份:陰影和凹凸貼圖,做一些簡單的介紹. [作者/陳秉哲] 原文链接 ...

最新文章

  1. Go 语言编程 — 高级数据类型 — Map 集合
  2. JVM之垃圾收集器回收种类
  3. 1054 The Dominant Color (20 分)_12行代码AC
  4. 超级菜菜鸟全程架站攻略(Mysql+Apche+PHP+Phpmyadmin+Zend,含本机安装)
  5. hortonworks/registry : ClassNotFoundException: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
  6. MyBatis→SqlSession、sqlMapConfig.xml、映射XML文件、OGNL、拼接SQL标签、取值查值、批量SQL、一对多多对一多对多
  7. 安全分析:叫好不叫座
  8. Seaborn可视化 -- 分类统计图seaborn.catplot
  9. Jsoup爬虫获取公司纳税识别号
  10. 严蔚敏《数据结构》表达式求值
  11. 外星人笔记本计算机在哪里,笔记本电脑没声音,教您外星人笔记本没声音如何解决...
  12. 东北大学秦皇岛分校计算机类排名,东北大学秦皇岛分校全国排名,2021东北大学秦皇岛分校排名榜...
  13. 阿姨,我真不是修电脑的!
  14. 淘宝订单、API获取订单
  15. Android 6.0 Marshmallow介绍
  16. Spring各种注解 @PersistenceContext和@Resource @GetMapping、@PostMapping、@PutMapping、@DeleteMapping
  17. RGB图像之灰度级和通道的理解(矩阵含义等)
  18. freshman refresh
  19. 英语不好的同学已经期盼已久了!IDEA、Clion、Pycharm等2020版本支持中文啦,汉化教程
  20. 我是怎么和SAP结缘的 - Jerry的SAP校园招聘之路

热门文章

  1. 用keil怎么擦除_keil如何使用?图文教程告诉你keil怎么使用
  2. AlertManager实现企业微信报警(十三)
  3. supervisor+nginx+cesi
  4. android学习记录(3)查看Device File Explore
  5. 真实骑手数据:73万大学毕业生在送外卖
  6. FPGA学习:Verilog基本语法
  7. 去中心化存储项目终极指南 | Filecoin, Storj 和 PPIO 项目异同(上)
  8. 一篇文章搞懂前端学习方法与构建知识体系
  9. latex 如何输入 双斜杠 单斜杠
  10. TPT又一次重量级更新——TPT16使嵌入式测试变得更加轻松