您的位置:首页 > 移动开发 > Unity3D

定向光的阴影

2018-02-05 22:14 204 查看
原文链接:定向光的阴影

阴影级联

Shadow distance

Visualising shadow parameter adjustments

Shadow Pancaking这个没看懂

定向光的典型应用是模拟太阳光和照亮整个场景的单一光源。这样shadow map会立刻覆盖场景中很大一部分,容易使阴影出现一种叫做透视锯齿的问题。透视锯齿是指shadow map中距离相机近的像素相较于远处的像素被放大和块状化。



较远位置A处阴影正常,距离相机较近的位置B出现了锯齿阴影

使用软阴影和高分辨率的shadow map时,透视锯齿不会很明显。但是这些方法会增加图形显卡的要求,帧率也会下降。

阴影级联

透视锯齿出现的原因,是shadow map中的不同区域会被透视相机不成比例缩放。light的shadow map只需要覆盖场景中对由相机的视锥可见的部分场景。想象场景正上方的定向光,可以清晰地看到视锥和shadow map之间地关系。



视锥远处覆盖了shadow map的20个像素,而近处只有4个像素。但是两者在相机中地成像大小是一样的。就会导致shadow map距离相机较近位置形成的阴影分辨率显著降低。(注意在实际情况中,shadow map分辨率一般会远大于20*20,并且也不会刚好就是正方形)。

给整个shadow map使用更高的分辨率可以减轻块状区域的问题,但会渲染时增加内存和带宽消耗。从图中可以发现,shadow map距离视锥近的一大部分区域浪费了,因为相机看不到;而距离相机原的地方shadow map的分辨率又太高。可以根据两个区域到相机的距离,将视锥区域分割成两块。距离较近的这一块使用较小面积的独立shadow map(保持相同的分辨率,即减小区域像素个数不变),这样像素的个数可以得到平衡。



这种分级减小shadow map面积的方法被称为cascaded shadow maps(也被称为”Parallel Split Shadow Maps”)。在Quality Settings中,可以为给定的质量等级设置0,1,2或4级级联。



使用的级数越多,阴影收透视锯齿的影响越小,但会增加渲染时的性能消耗。但是消耗比在整个shadow map中使用高分辨率要小。



上面的例子应用四级级联后的阴影

Shadow distance

距离相机较远的物体形成的阴影会变得不明显。阴影会变小,并且远处的物体不会是关注的焦点。Unity中可以设置Quality Settings中的Shadow Distance属性来利用这种效果。与相机的距离超过设定值的物体不会投射阴影,而距离设置距离较近的物体阴影会慢慢变淡。

将shadow distance设置得尽可能小能够提升渲染性能。因为远处的物体不需要在shadow map中进行渲染。而且远处阴影被移除后场景会更好看。设置正确的shadow distance对于移动平台的性能很重要,因为它们不支持级联阴影。如果当前相机的far plane比shadow distance要小,Unity会用相机的far plane替换shadow distance的值。

Visualising shadow parameter adjustments

在场景视图中有一个Shadow Cascadesdraw mode,可以用来将不同的级联等级在场景中显示成不同的颜色。这个功能可以用来帮你调整shadow distance,级联数和cascade split ratios。注意这个可视化功能使用场景的far plane,通常会比shadow distance的值要大。所以在一个相机的far plane较小的游戏中,需要将shadow distance的值调小。



场景视图中的Shadow Cascades draw mode

Shadow Pancaking(这个没看懂)

我们用一种叫做Shadow pancaking的技术进一步处理阴影瑕疵。这个办法是通过减小渲染shadow map时的光照范围,来达到提高shadow map精度,较小阴影瑕疵的目的。



shadow pancaking的原理

在上面的图中:

- 浅蓝色的源泉代表阴影投射物。

- 深蓝色的矩形代表原来的光照范围。

- 绿颜色的线代表优化过的near plane(排除所有视锥外的阴影投射物)

将阴影投射物限制到优化范围的near clip plane中(使用Vertex Shader)。注意尽管这个方法在大多数情况下能正常工作,但是存在穿过near clip plane的巨大三角形时,会出现多余的人工物体。



大三角形时出现的问题

这时蓝色三角形只有一个定点在near clip plane后面and get clamped to it。这改变了三角形的形状并形成错误的阴影。

可以通过调整质量设置Shadow Near Plane Offset属性来避免这个问题。这个属性会拉回near clip plane,但是将这个值设得太大会导致阴影瑕疵,因为这样会增加shadow map在光照方向上需要覆盖得范围。也可以细化处理三角形投射阴影的麻烦。更多信息查看阴影概览bias部分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity manual shadow light