在Unity中实现屏幕空间阴影(1)
接着上篇文章,我们实现了SSR效果。
其中的在屏幕空间进行光线追踪的方法是通用的。借此我们再实现一种屏幕空间的效果,即屏幕空间阴影。
文中的图片来自Catlike coding
http://catlikecoding.com/unity/tutorials/rendering/part-7/
完成的工程: https://github.com/yangrc1234/ScreenSpaceShadow
原生阴影
首先我们要了解一下原生的阴影是怎么实现的,这里我们只讨论Directional Light。
首先,我们将Directional Light视作一个相机,对整个场景进行绘制。我们只需要其中的深度信息。(如果你尝试过自己写一个可以产生阴影的Shader,应该知道这个绘制是通过调用ShadowCaster类型的pass来实现的)
通过这样渲染的一张ShadowMap,在我们渲染主相机的画面时,对每一个像素,我们获得它的世界坐标,然后将该世界坐标转换到Directional Light的坐标系下,采样对应的ShadowMap中的点。如果我们采样出来的深度,大于该坐标的深度,我们认为该点没有被阻挡。否则认为该点处于阴影中。
这就是ShadowMap方法的简单描述。在Unity的Directional Light流程中,采用的是Cascade ShadowMap,此时会有若干个不同分辨率的ShadowMap被生成,分别对应与相机距离不同的区域,这样可以做到相机较近的区域,分辨率较高,阴影质量更好;较远的区域分辨率较低,质量一般(但是远了你也看不出来)。

Cascade ShadowMap示例
不同于其他类型的光源,在主相机渲染时,我们求一个点的光照度,并不是直接去转换坐标系然后采样ShadowMap。在Directional Light流程中,在主相机渲染之前,Unity会将Cascade ShadowMap转化为一张屏幕空间的阴影贴图(Screen Space Mask,当然该过程也需要转换坐标系去比较深度等等)。然后在主相机渲染时直接取采样这张屏幕空间阴影贴图获得光照度。

屏幕空间的阴影贴图示例
我们待会儿会通过操作这张屏幕空间阴影来实现我们的效果。
这种阴影实现毫无疑问是目前的主流方法。但是它也有不少问题,比如Shadow Acne现象。我们之前说到,判断一个点是否在阴影中,是通过深度比较进行的。但是我们要判断一个像素是否在阴影中时,因为深度贴图的精度问题,可能会出现被周围的差异极小的像素遮挡的情况。

屏幕空间阴影
屏幕空间阴影基于屏幕空间光线追踪实现阴影效果。
最大的好处就是让不参与ShadowMap绘制的物体也可以投出阴影。
而且作为一个屏幕效果,其效率与场景复杂度无关。
在绘制大量的小型物体时,这一优势是很明显的。
下图是一个效果关闭开启的对比。图中的草是Unity的Terrain系统绘制的,默认不开启阴影。可以看到开启屏幕空间阴影后画面提升明显。

在Unity中实现屏幕空间阴影(1)的更多相关文章
- 在Unity中实现屏幕空间阴影(2)
参考文章: https://www.imgtec.com/blog/implementing-fast-ray-traced-soft-shadows-in-a-game-engine/ 完成的工程: ...
- 在Unity中实现屏幕空间反射Screen Space Reflection(4)
第四部分讲一下如何在2D屏幕空间步进光线. http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html 中的代码感 ...
- 在Unity中实现屏幕空间反射Screen Space Reflection(1)
本篇文章我会介绍一下我自己在Unity中实现的SSR效果 出发点是理解SSR效果的原理,因此最终效果不是非常完美的(代码都是够用就行),但是从学习的角度来说足以学习到SSR中的核心算法. 如果对核心算 ...
- 在Unity中实现屏幕空间反射Screen Space Reflection(3)
本篇讲一下相交检测的优化.有两个措施. 线段相交检测 之前的检测都是检测光线的终点是否在物体内.我们可以尝试检测光线的线段是否与物体相交. 比如说有一个非常薄的物体,光线差不多垂直于它的表面.如果用普 ...
- 在Unity中实现屏幕空间反射Screen Space Reflection(2)
traceRay函数 在上一篇中,我们有如下签名的traceRay函数 bool traceRay(float3 start, float3 direction, out float2 hitPixe ...
- 关于Unity中的屏幕适配
一.Game视图的屏幕分辨率可以先自定义添加,供以后选择,以下是手游经常用到的分辨率: 1.1136X640,iPhone5 2.1920X1080,横屏,主流游戏都是这个分辨率 3.1080X192 ...
- 浅谈unity中gamma空间和线性空间
转载请标明出处:http://www.cnblogs.com/zblade/ 一.概述 很久没有写文章了,今天写一篇对gamma空间和线性空间的个人理解总结,在查阅和学习了各个资料后,算是一个个人笔记 ...
- 【Unity技巧】Unity中的优化技术
http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...
- Unity中的优化技术
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/candycat1992/article/ ...
随机推荐
- 【转】Apache httpd.conf配置解释
转自:http://jafy00.blog.51cto.com/2594646/501373 常用配置指令说明 1. ServerRoot:服务器的基础目录,一般来说它将包含conf/和logs/子目 ...
- arp_filter的验证,使用net namespace
使用网络命名空间:net namespace 在namespace ns1中增加了两个网卡 sudo ip netns add ns1 sudo ip link add veth0 type veth ...
- web三大组件的加载顺序
Web三大组件:过滤器组件 监听器组件 Servlet组件 过滤器的顶级接口:javax.servlet.Filter 监听器的顶级接口:javax.servlet.ServletContextL ...
- ADB抓取日志和日志过滤
建议抓取日志之前先清除缓存的log数据:adb logcat -c 网上有人介绍可以这样写:adb logcat -c && adb logcat 1.使用V.D.I.W.E.F.S优 ...
- 【Quartz.NET】Quartz.NET 入门
概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...
- 洛谷 P5078 Tweetuzki 爱军训
题目连接 很明显,1e6的范围,要么nlgn要么O(n) nlgn的话可能会想到借助一些数据结构,我并没有想到这种做法 对于这种题,O(n)的做法要么是线性递推,要么就应该是贪心了 考虑这道题我们怎么 ...
- 【刷题】BZOJ 1030 [JSOI2007]文本生成器
Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生 ...
- 【刷题】BZOJ 4349 最小树形图
Description 小C现在正要攻打科学馆腹地------计算机第三机房.而信息组的同学们已经建好了一座座堡垒,准备迎战.小C作为一种高度智慧的可怕生物,早已对同学们的信息了如指掌. 攻打每一个人 ...
- IOS中手势UIGestureRecognizer
通常在对视图进行缩放移动等操作的时候我们可以用UIScrollView,因为它里边自带了这些功能,我们要做的就是告诉UIScrollView的几个相关参数就可以了 但是没有实现旋转的手势即UIRota ...
- Coding and Paper Letter(四十五)
资源整理. 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型. 它还支持随机建模以解决参数和模型 ...