阴影

35 篇文章 0 订阅

原文链接:阴影

Unity能将物体的阴影投射到物体自身的其他部分或者附近的其他物体上。阴影使原本看起来扁平的物体表现出了尺寸和位置,从而一定程度上增加了场景的深度和现实感。
alt text
场景中物体投射的阴影

阴影如何工作?

考虑一个只有单一光源的场景。光线从光源以直线向外传播最终可能碰到场景中的物体。由于光线不能达到的区域就会形成阴影。
alt text
另外一个方法是想象一个处在光源位置的相机。场景中的阴影区域切好就是相机无法看到的区域。
alt text
light视角的场景

实际上,这正是Unity确定一个光源的阴影位置的方法。Light按照相机的方式‘渲染‘场景。与场景中的相机一样,使用深度缓冲系统跟踪离光源最近的表面;视线能到达的表面被照亮,所有其他区域都在阴影中。这个深度图被称为Shadow Map(详细信息可以参考维基关于Shadow mapping的介绍)。

启用阴影

在Inspector中为每个light启用并指定阴影类型。
alt text

  • Shadow Type:Hard Shadows会生成边缘尖锐的阴影,看起来没有Soft Shadows真实,但是计算量较小,并且在许多情况下是可接受的。同时Soft Shadows需要减弱shadow map中的块状锯齿效应。
  • Strength:阴影的深度。有些光会被大气层散射或者被其他GameObjects散射,所以通常不会将阴影深度设置为最大。
  • Resolution:设置上面提到的shadow map相机的渲染分辨率。如果阴影的边缘太明显,可以考虑增大这个值。
  • Bias:用来精化阴影的位置和定义。参考下面的Shadow mapping and the Bias property
  • Normal Bias:用来精化阴影的位置和定义。参考下面的Shadow mapping and the Bias property
  • Shadow Near Plane:设置渲染阴影的近平面。比给定距离近的GameObject不会投射阴影。
    场中中的每个Mesh Renderer都有Case ShadowsReceive Shadows属性,必须正常启用。
    alt text
    在下拉菜单中选择On/Off来启用或禁用mesh的阴影投射。也可以选择Two Sided让表面的两侧都能投射阴影,或者**Shadow Only显示一个不可见GameObject的阴影。

Shadow mapping and the Bias property

特定Light的阴影在最终场景渲染时决定。当主相机渲染场景时,视野中的每个像素的位置会被转换到Light的坐标系统。将像素与Light的距离和shadow map中对应像素的距离进行比较。如果比shadow map中的距离大,则可以确定这个像素被其他的GameObject遮挡而没有被Light照亮。
alt text
正确的阴影

被Light直接照射的表面有时候会出现部分阴影的情况。这是因为shadow map中应该准确计算距离的像素实际上是在按照较远的位置计算的(这是使用shadow filtering,或者使用低分辨率的shadow map造成的)。阴影像素分布的模式时随机的,这种效果被称为’shadow acne’。
alt text
自阴影物体的shadow acne

为了处理shadow acne,可以向shadow map中的距离增加一个Bias,以保证边缘的像素按照真实距离进行比较,或者保证渲染shadow map时GameObjects比正常距离稍微长一点。
不要将Bias设置过大,因为GameObject投射的阴影可能会被错误的照亮。结果就会形成断开的阴影,使GameObject看起来漂在地面上方。
alt text
过大的Bias让阴影和GameObject断开了

同样,Normal Bias设置得过大会让GameObject的阴影变窄。
alt text
过大的Normal Bias使阴影变窄
在某些情况下,Normal Bias会导致“light bleeding”的问题,也就是light从附近的几何体漏进了应该是阴影的区域。一种方法使将GameObject的Mesh RendererCast Shadows属性设置为Two Sided。这有时候管用,尽管在渲染场景时会增加资源和性能开销。
Light的bias可能需要仔细调整以避免不好的效果出现。一般通过调整后观察是否良好,而不是尝试去计算这个值。
进一步处理shadow acne,可以使用一个叫Shadow pancaking的技术(参见Directional light shadows: Shadow pancaking)。这个方法一般可以很好的工作,but can create visual artifacts for very large triangles。
alt text
Shadow near plane太小在阴影中形成了空洞

调整Shadow Near Plane Offset属性来处理这个问题。这个值太大会形成shadow acne。
alt text
正确的阴影

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值