在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/ ...
随机推荐
- 软工alpha阶段个人总结
一.个人总结 类别 具体技能和面试问题 现在的回答(大三下) 语言 最拿手的语言之一,代码量是多少? java,代码量在一万行左右 语言 最拿手的语言之二,代码量是多少? C语言,代码量在五千行左右 ...
- QCryptographicHash实现哈希值计算,支持多种算法
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QCryptographicHash实现哈希值计算,支持多种算法 本文地址:http: ...
- elasticsearch6 学习之批量操作
环境:elasticsearch6.1.2 kibana6.1.2 一.mget批量查询 mget可以将多个请求才能获的数据,合并到一个请求中以节省网络开销. 1.查询同一个索引下,通 ...
- [AT2363] [agc012_c] Tautonym Puzzle
题目链接 AtCoder:https://agc012.contest.atcoder.jp/tasks/agc012_c 洛谷:https://www.luogu.org/problemnew/sh ...
- Middle of Linked List
Find the middle node of a linked list. Example Given 1->2->3, return the node with value 2. Gi ...
- position:fixed 相对父元素定位
position:fixed是对于浏览器窗口定位的,要实现相当于父元素定位,可以这样: 不设置fixed元素的top,bottom,left,right,只设置margin来实现. 这种方法本质上fi ...
- 使图片水平并垂直居中的一个Hack
淘宝的一个前端面试题:使用纯CSS实现未知尺寸的图片(但高宽都小于200px)在200px的正方形容器中水平和垂直居中. 想起了vertical-align:middle;但是不行,后来才知道还要di ...
- Hdu5693 D Game
D Game Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- Codeforces Round #546 (Div. 2) ABCDE 题解
1136A: 题意:一本书有n个章节,每个章节的分别在li到ri页,小明读完书后将书折在第k页,问还有多少章节没有读 题解:控制k在li~ri的范围内后输出n-i即可 #include <set ...
- golang设置代理
http://note.youdao.com/noteshare?id=a8df0ec2d623f282a782dbe937bdae9f