接着上篇文章,我们实现了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)的更多相关文章

  1. 在Unity中实现屏幕空间阴影(2)

    参考文章: https://www.imgtec.com/blog/implementing-fast-ray-traced-soft-shadows-in-a-game-engine/ 完成的工程: ...

  2. 在Unity中实现屏幕空间反射Screen Space Reflection(4)

    第四部分讲一下如何在2D屏幕空间步进光线. http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html 中的代码感 ...

  3. 在Unity中实现屏幕空间反射Screen Space Reflection(1)

    本篇文章我会介绍一下我自己在Unity中实现的SSR效果 出发点是理解SSR效果的原理,因此最终效果不是非常完美的(代码都是够用就行),但是从学习的角度来说足以学习到SSR中的核心算法. 如果对核心算 ...

  4. 在Unity中实现屏幕空间反射Screen Space Reflection(3)

    本篇讲一下相交检测的优化.有两个措施. 线段相交检测 之前的检测都是检测光线的终点是否在物体内.我们可以尝试检测光线的线段是否与物体相交. 比如说有一个非常薄的物体,光线差不多垂直于它的表面.如果用普 ...

  5. 在Unity中实现屏幕空间反射Screen Space Reflection(2)

    traceRay函数 在上一篇中,我们有如下签名的traceRay函数 bool traceRay(float3 start, float3 direction, out float2 hitPixe ...

  6. 关于Unity中的屏幕适配

    一.Game视图的屏幕分辨率可以先自定义添加,供以后选择,以下是手游经常用到的分辨率: 1.1136X640,iPhone5 2.1920X1080,横屏,主流游戏都是这个分辨率 3.1080X192 ...

  7. 浅谈unity中gamma空间和线性空间

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.概述 很久没有写文章了,今天写一篇对gamma空间和线性空间的个人理解总结,在查阅和学习了各个资料后,算是一个个人笔记 ...

  8. 【Unity技巧】Unity中的优化技术

    http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...

  9. Unity中的优化技术

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/candycat1992/article/ ...

随机推荐

  1. 【第五周】alpha发布之小组评论

    对于昨天的阿尔法发布,有那么几点需要说一下: 1,对这次阿尔法发布的过程,我们组还是基本顺利的,由于之前吃过亏,这次我提前试用了一下投影仪,做了些调试,之后的发布过程起码设备上是正常的. 2,我们的项 ...

  2. Laravel 框架集成 UEditor 编辑器的方法

    ㈠. 背景 在项目开发的过程中,免不了使用修改功能,而富文本编辑器是极为方便的一种推荐,当然,个人认为 MarkDown 更为简单,但是感觉暂时只适合程序猿    此文介绍如何在 Laravel5.5 ...

  3. Linux下objdump查看C程序编译后的汇编代码

    http://m.blog.csdn.net/article/details?id=47747047 Uboot中start.S源码的指令级的详尽解析 http://www.crifan.com/fi ...

  4. 第85天:HTML5语义化标签

    一.语义标签 语义标签对于我们并不陌生,如<p>表示一个段落.<ul>表示一个无序列表<h1> ~ <h6>表示一系列标题等,在此基础上HTML5增加了 ...

  5. hdu 6434 Count (欧拉函数)

    题目链接 Problem Description Multiple query, for each n, you need to get $$$$$$ \sum_{i=1}^{n} \sum_{j=1 ...

  6. CF373C-Counting Kangaroos is Fun

    题意 有\(n\)只袋鼠,每只袋鼠有一个体积,如果一个袋鼠的体积小于等于另一个袋鼠体积的一半,那么这个袋鼠就可以被那一个袋鼠装进袋里.一个装了袋鼠的袋鼠不能再装或被装.被装进袋子的袋鼠就看不到了. 问 ...

  7. 详解SQL Server数据修复命令DBCC的使用

    严重级别为 21 表示可能存在数据损坏. 可能的原因包括损坏的页链.损坏的 IAM 或该对象的 sys.objects目录视图中存在无效条目. 这些错误通常由硬件或磁盘设备驱动程序故障而引起. MS ...

  8. BZOJ3574 HNOI2014抄卡组(哈希)

    容易发现通配符中间的部分可以任意匹配,会造成的无法匹配的仅仅是前后缀,前缀和后缀可以分别独立处理.如果字符串均有通配符,只需要按前/后缀长度排序然后暴力匹配就可以了. 问题在于存在无通配符的字符串.显 ...

  9. [BZOJ2432][Noi2011]兔农 矩阵乘法+exgcd

    2432: [Noi2011]兔农 Time Limit: 10 Sec  Memory Limit: 256 MB Description 农夫栋栋近年收入不景气,正在他发愁如何能多赚点钱时,他听到 ...

  10. 获取和验证Windows AD域的用户信息

    1.获取windows AD域用户信息,首先需要有一个ad域管理员权限的账号,用这个账号连接ad域,获取所有域用户信息 用LdapContext,它继承自DirContext public Objec ...