Shadowmask 是 Shadowmask 光照模式的一个版本,由场景中的所有混合光源共用。要将 Mixed lighting 设置为 __Shadowmask__,请执行以下操作:
请参阅混合光照相关文档以了解有关此光照模式的更多信息,并参阅光照模式相关文档以了解有关其他可用模式的更多信息。
阴影遮罩是一种纹理,它与相应的光照贴图共享相同的 UV 布局和分辨率。它存储每个纹理像素的最多 4 个光源的遮挡信息,因为纹理在当前 GPU 上限制为最多 4 个通道。
Unity 预先计算从静态游戏对象投射到其他静态游戏对象的阴影,并将它们存储在单独的阴影遮罩纹理中,最多达 4 个重叠光源。如果超过 4 个光源重叠,则多余光源会回退至烘焙光照。具体要回退至烘焙光照的光源视烘焙系统而定并在各烘焙之间保持一致,除非修改其中某个光源重叠。光照探针还会接收多达 4 个光源的相同信息。
光源重叠是独立于阴影接受对象计算的。因此,一个对象可受到全部来自同一个阴影遮罩/探针通道的 10 个不同混合光源的影响,只要这些光照包围体在空间中的任何点都不重叠即可。如果某些光源重叠,则使用更多通道。如果光源确实发生重叠而所有 4 个通道都已分配,则该光源将回退至完全烘焙。
在 Shadowmask 模式下:
无论__阴影距离 (Shadow Distance)(菜单:__Edit > Project Settings__,然后选择 Quality__ 类别,并导航到 Shadows 部分)如何,静态游戏对象始终通过阴影遮罩接受其他静态游戏对象投射的阴影。它们也会接受动态游戏对象投射的阴影,但仅限于__阴影距离__内的阴影。
动态游戏对象通过阴影贴图接受其他动态游戏对象投射在__阴影距离__内的阴影。它们也会通过光照探针接受静态游戏对象投射的阴影。阴影保真度取决于场景中的光照探针的密度以及在网格渲染器 (Mesh Renderer) 上选择的__光照探针__模式。
Unity 会自动合成来自静态和动态游戏对象的重叠阴影,因为阴影遮罩(其中保存静态游戏对象光照和阴影信息)和阴影贴图(其中保存动态游戏对象光照和阴影信息)仅编码遮挡信息。
适合使用 Shadowmask 模式的一个很好的例子是,您想要构建一个几乎完全静态的场景,使用镜面反射材质、柔和的烘焙阴影和动态阴影投射物,不要太靠近摄像机。另一个很好的例子是一个开放世界的场景,其中的烘焙阴影延伸到地平线,但没有动态光照,如白天/夜晚循环。
下表显示了使用 Shadowmask 模式时静态和动态游戏对象如何投射和接受阴影:
动态阴影接受者 从另一个静态或动态游戏对象接受阴影的动态游戏对象 |
静态阴影接受者 从另一个静态或动态游戏对象接受阴影的静态游戏对象 |
|||
---|---|---|---|---|
在阴影距离内 | 超出阴影距离 | 在阴影距离内 | 超出阴影距离 | |
动态阴影投射物 投射阴影的动态游戏对象 |
阴影贴图 | - | 阴影贴图 | - |
静态阴影投射物 投射阴影的静态游戏对象 |
光照探针 | 光照探针 | 阴影遮罩 | 阴影遮罩 |
鉴于 Shadowmask 模式的性能要求,该模式非常适合以中低端 PC 和移动设备为目标的构建。Shadowmask 模式最主要的优缺点如下:
提供与实时光照相同的视觉效果。
提供从动态游戏对象到静态游戏对象的实时阴影。
着色器中的一个纹理操作即可处理静态游戏对象之间的所有光照和阴影。
自动合成静态和动态游戏对象的重叠阴影。
具有中低级别性能要求,因为它不会将静态游戏对象渲染到阴影贴图中。
提供间接光照。
仅通过光照探针提供从静态游戏对象到动态游戏对象上的低分辨率阴影。
最多只允许 4 个重叠的光源体积(请参阅混合光照的“技术细节”部分下的文档以了解更多信息)。
增加了光照贴图纹理集的内存要求。
增加了阴影遮罩纹理的内存要求。
2017–09–18 页面已修订并只进行了有限的编辑审查
在 5.6 版中添加了“光照模式”
在 Unity 2017.1 中添加了关于光照重叠计算的建议
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.