Unity3D中两种阴影的实现

传统的ShadowMap

ShadowMap说起来十分简单,把摄像机和光源的位置重叠,那么场景中该光源的阴影区域就是那些摄像机看不到的地方,主要应用在前向渲染路径中。

具体实现分以下几个步骤:

  • 如果有平行光开启了阴影,Unity就会为该光源计算它的ShadowMap(只会计算一个平行光),这张ShadowMap其实就是深度图,记录了从该光源的位置出发、能看到的场景中距离它最近的表面位置(深度信息)。
  • Unity中实现了一个额外的Pass来专门更新光源的ShadowMap,这个Pass就是LightMode标签被设置为ShadowCaster的Pass。
  • 然后在正常渲染的Pass中把顶点位置变换到光源空间下,以得到它在光源空间中的三维位置信息。然后根据坐标信息对ShadowMap采样,得到该点在ShadowMap中的深度信息。比较后,判断该点是否应该在阴影中。
  • 注意:利用Receive Shadows的开关可以控制物体是否显示阴影,但是不影响渲染。而Cast Shadows的开关则控制该物体是否会加入到Shadowmap的渲染。

屏幕空间的阴影

延迟渲染中的光照计算绝大部分都是在屏幕空间里进行的,同样也包括阴影。这种屏幕空间的阴影实现主要有这么几个步骤:

延迟渲染中的光照计算绝大部分都是在屏幕空间里进行的,同样也包括阴影。这种屏幕空间的阴影实现主要有这么几个步骤:

  1. 首先得到从当前摄像机处观察到的深度纹理。在延迟渲染里这张深度图本来就有,如果是前向渲染的话就需要把场景整个渲染一遍,把深度渲染到深度图中。
  2. 然后再从光源出发得到从该光源处观察到的深度纹理,也被称为这个光源的ShadowMap
  3. 然后在屏幕空间做一次阴影收集计算(Shadows Collector),这次计算会得到一张屏幕空间阴影纹理,也就是说这张图里面需要有阴影的部分已经显示在图上了。这个过程概括来说就是把每一个像素根据它在摄像机深度纹理中的深度值得到世界空间坐标,再把它的坐标从世界空间转换到光源空间中,和光源的ShadowMap里面的深度值对比,如果大于ShadowMap中的深度距离,那么就说明光源无法照到,在阴影内。
  4. 最后,在正常渲染物体为它计算阴影的时候,只需要按照当前处理的fragment在屏幕空间中的位置对步骤3得到的屏幕空间阴影图采样就可以了。

Unity3D中开启不同阴影的情况

截止到Unity 5.4,当项目工程的目标平台是Mobile的时候,就不会使用屏幕空间的阴影映射技术,即使用原始的Shadows Map方法。在代码里,Unity会定义内置宏UNITY_NO_SCREENSPACE_SHADOWS来控制。而当项目工程的目标平台是支持屏幕空间阴影的话,例如PC, Mac & Linux Standalone平台时,会开启屏幕空间的阴影映射技术。

我们可以通过帧调试器(Frame Debugger)来分辨当前是否使用了屏幕空间的阴影映射技术:

整理自 《Unity Shader入门精要》

unity3d软阴影和硬阴影的原理_Unity3D中两种默认阴影的实现相关推荐

  1. Unity3D动作类游戏中两种相机抖动

    Unity3D动作类游戏中两种相机抖动 在动作类RPG游戏中,为了体现角色的技能和增加动作打击感,我们常常会给相机添加抖动效果来配合特效做一些技能效果. 我在网上搜了一下,然后结合自己的项目总结一下, ...

  2. unity3d软阴影和硬阴影的原理_人像摄影的重要技法:控制、利用阴影

    刚接触人像摄影时,很多人对人脸上阴影十分 "忌惮",甚至因此偏好使用顺光,或通过个方位补光来完全消除阴影. 这样的操作,往往会拍出明亮.干净,对比度小的图像.或许这符合一些题材的要 ...

  3. unity3d软阴影和硬阴影的原理_使用随机采样创建软阴影

    本文是OpenGL 4.0 Shading Language Cookbook的学习笔记. Shadowmap的基础实现结合PCF可以产生软阴影.但是,如果想要更大宽度的软阴影,这种方法需要增加大量采 ...

  4. unity3d软阴影和硬阴影的原理_在广告摄影中阴影和高光的重要作用和控制技巧...

    投影和高光在大多数广告摄影画面中是不可避免的(除非像无投影布光或被摄体为非光洁表面),但又往往是影像的重要的组成部分. 投影和高光的存在,既有助于造型和质感的表现,但处理不当时,又会破坏画面和使人感到 ...

  5. unity3d软阴影和硬阴影的原理_手术无影灯的原理

    手术无影灯是将灯的角度或者抛光反射面的角度调节成一种环形光照,从而达到照射部位结构凸凹形成的暗影或死角,成为亮度均匀的画片,为手术区域提供照明的专用设备. 手术无影灯是利用多点光源效应的原理设计的,即 ...

  6. unity3d做会减少的血条_Unity3d中NGUI加强版血条(Healthbar)的制作

    这阵子项目中需要用到一种特殊样式的血条.描述如下: 1. 正常颜色为红色.受到伤害后,即将扣除的血量变暗(暗红色),并有下降动画效果: 2. 加护盾效果后,增加一部分血量值,该额外部分为白色,护盾效果 ...

  7. 软考--后缀式(逆波兰式)的两种求法

    首先理解概念: 后缀式:又叫逆波兰式 -用"左右根"表示 如图1后缀式:左右根-a+* 如图2后缀式:左右根-a-d*+ Tips:相关的知识 前序遍历:根左右 中序遍历:左根右 ...

  8. unity3d 工程原理_Unity3D重要知识点

    数据结构和算法很重要!图形学也很重要!大的游戏公司很看重个人基础,综合能力小公司看你实际工作能力,看你的Demo. 1.什么是渲染管道? 是指在显示器上为了显示出图像而经过的一系列必要操作. 渲染管道 ...

  9. unity3d 工程原理_Unity3D研究院之两个游戏工程资源同步问题(八十六)

    有的公司是不想让美术和策划有程序权限的,但是Unity在处理团队协作上不太理想,这就造成需要把美术工程的资源同步到程序工程里.目前我有两个方法,各有利弊. 1.由美术或者策划同步 Unity提供了.u ...

最新文章

  1. FPGA之道(70)提高设计的综合性能(二)提高设计的自测性
  2. mysql innodbuffer修改_mysql参数之innodb_buffer_pool_size大小设置
  3. 我们是移动的韭菜么?似乎程序员去哪里上班,哪里房价就贵起来了?扎心......
  4. StringUtils 正则校验
  5. Oracle FGA审计记录的清理步骤
  6. access四舍五入取整round_access中round函数怎么用
  7. 用数据库修改服务器的时间格式,如何查询数据库服务器的时间格式
  8. java中数据库查询_在java中对数据库查询
  9. html 名人名言源代码,基于JQuery及AJAX实现名人名言随机生成器_咋地 _前端开发者...
  10. MySQL高级查询语句——超详细,一篇就够了
  11. nginx端口映射配置(Windows)
  12. 第三方开源项目名称_开源名称中有什么?
  13. PGM学习之七 MRF,马尔科夫随机场
  14. 2022年了,密码该如何保存都不会?
  15. vba 保存word里面的图片_word表格技巧:如何对表格进行样式批处理
  16. [深度学习] 自然语言处理 --- NLP入门指南
  17. 有限元三角形单元的等效节点力
  18. android 获取wifi信号强度,获取wifi当前手机连接的wifi信息以及信号强度
  19. python 计时方法_Python计时器类| cancel()方法与示例
  20. CIDC(中国华大)样片申请与经验

热门文章

  1. when I enter ZSOCIAL role FM RH_STRUC_GET to get organization units that a given user belongs to
  2. why context node binding does not work in pop up window case
  3. 数据库服务器的文件结构6,以下数据库服务器的文件结构
  4. docker添加jar包_docker配置容器运行jar包
  5. 副主任护师主要英语和计算机吗,有没有晋升副主任护师的
  6. 学士学位非计算机专业考试真题,大学学位计算机考试习题
  7. oracle日志文件打开,oracle日志文件和控制文件损坏的恢复
  8. python做动画视频教程_Python零基础入门动画教程
  9. IntelliJ IDEA启动Tomcat控制台乱码问题解决
  10. java system.in 输入不回显_Java安全之URLDNS链