【Unity Shader学习笔记】Unity光照-阴影

Java86

1、原理

一个对象在其他对象上投射阴影,以及一个对象如何接收其他对象的阴影。

[En]

One object casts shadows on other objects, and how one object receives the shadows of other objects.

实时渲染中经常使用 Shadow Map 技术。它会首先把摄像机的位置放在与光源重合的位置上, 那么场景中该光源的阴影区域就是那些摄像机看不到的地方。Unity 就是使用的这种技术。

在前向渣染路径中, 如果场景中最重要的平行光开启了阴影, Unity 就会为该光源计算它的阴影映射纹理( shadow map)。 这张阴影映射纹理本质上也是一张深度图, 它记录了从该光源的位置出发、 能看到的场景中距离它最近的表面的深度信息。

Unity 选择使用一个额外的 Pass 来专门更新光源的阴影映射纹理, 这个 Pass 就是 LightMode 标签被设
置为 ShadowCaster 的 Pass。

这个 Pass 的渲染目标为深度纹理。

Unity 首先把摄像机放置到光源的位置上, 然后调用该 Pass, 通过对顶点变换后得到光源空间下的位置, 并据此来输出深度信息到阴影映射纹理中。

正常情况下,我们在渲染阴影时,会将每个顶点位置变换到光源空间下, 然后使用 xy 分量对阴影映射纹理进行采样,得到阴影映射纹理中该位置的深度信息。 如果该深度值小于该顶点的深度值( z 分量),那么说明该点位于阴影中。

Unity 提出了一种新的采样技术:屏幕空间的阴影映射技术(Screenspace Shadow Map)。

这项技术原本时延迟渲染中产生阴影的一种方法。应用这项技术要求显卡支持 MRT 。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长