Unity Shadow 如何实现超远的光源阴影

目的:如何实现超远的光源的阴影,最好可以兼顾近景与远景的阴影。(本文仅作为日常工作的调研记录)

测试场景(只有一个平行光作为主光源):

Shadow Distance = 50时,近景可以看到角色和树下的阴影,远处的山上没有阴影。

Shadows的配置如下:

 

查阅了官方资料与其他资料后,提出了两种方案:

 

方法1:可以将近景的阴影与远景的阴影分开处理,通过动态设置Shadow Distance来规避时近景阴影质量下降的问题及远景没有阴影的问题。

 

方法2:调整Shadow Projection

属性说明:

Shadow Projection

Choose which method to use for projecting shadows from a directional light.

Close Fit

Renders higher resolution shadows but they can sometimes wobble slightly if the camera moves.

Stable Fit

Renders lower resolution shadows but they don’t wobble with camera movements.

平行光投射阴影有2种方式:

Close Fit渲染较高分辨率的阴影,但是如果相机移动时,有时阴影会轻微摆动。

Stable Fit渲染的阴影分辨率较低,不过相机移动时不会发生摆动。

 

将Stable Fit 改为 Close Fit,可以兼顾近景与远景的需求,设置如下

可以获得下图的效果:

可以看到近景的阴影差别不大,远处的高山上也有了阴影。需注意当镜头移动时,要确认阴影会否出现抖动的问题,如果性能开销可以接受,可以适当提高Shadow Resolution的设置来规避。(场景远处的效果并不是最终效果,仅在当前的项目场景上为新项目调研效果)

 

由于不确定Shadow Distance 与 Shadow Projection对于开销的影响,对不同配置下的当前场景开销做了对比:

Shadow Distance : 50

 

Shadow Projection :     Stable Fit                  Close Fit


 

Shadow Projection :     Close Fit

    

Shadow Distance :                100                            1000                                        10000


 

Shadow Projection:    Close Fit

Shadow Distance :      10000

      

Shadow Resolution:        Medium                                                    High                                             Very High


除了出现个别10ms的峰值,性能消耗并没有明显的上升,峰值出现的频率也在较低的水平。可以尝试采用该方法来兼顾近景与远景的阴影

参考资料:

https://docs.unity3d.com/Manual/class-QualitySettings.html

https://blog.uwa4d.com/archives/2127.html

http://www.ceeger.com/Components/class-QualitySettings.html

Unity中可以使用ShadowMap来实现阴影效果,并且可以通过阴影的颜色、透明度等参数来实现阴影的分析和变化。以下是一个简单的实现步骤: 1.在Unity中创建一个场景,并将需要投射阴影的物体放置在场景中。 2.在场景中创建一个光源,并将其设置为投影模式。在光源的参数设置中,选择Shadow Type为Hard Shadows或Soft Shadows,并将Resolution设置为需要的大小。 3.在被投射阴影的物体上,将其接收阴影的属性设置为true。这可以通过在物体的Renderer组件中设置Cast Shadows为On,或者通过代码设置。 4.在阴影的Material中,可以设置颜色、透明度等参数来实现阴影的分析和变化。例如,可以根据时间、位置等因素来改变阴影的颜色或透明度。 以下是一个示例代码,可以在Update函数中实现根据时间变化阴影颜色的效果: ```csharp public class ShadowColor : MonoBehaviour { public Material shadowMaterial; //阴影的材质 public Color startColor; //开始颜色 public Color endColor; //结束颜色 public float duration = 2.0f; //变化时长 private float startTime; //开始时间 void Start() { startTime = Time.time; } void Update() { float t = (Time.time - startTime) / duration; shadowMaterial.color = Color.Lerp(startColor, endColor, t); } } ``` 在该代码中,首先定义了阴影的材质和起始、结束颜色。然后,在Start函数中记录了开始时间,每帧根据时间变化计算阴影颜色,最终将其赋值给阴影的材质。可以根据需要修改该代码来实现不同的阴影分析和变化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值