Unity 使用一种称为阴影贴图的技术来渲染实时阴影。
阴影贴图使用称为“阴影贴图”的纹理。阴影贴图类似于深度纹理。光源生成阴影贴图的方式与摄像机生成深度纹理的方式类似。假设摄像机与光源位于相同的位置,则摄像机无法看到的场景区域与光源的光线无法到达的场景区域相同;因此,这些区域处于阴影中。
Unity 会在阴影贴图中填充与光线在射到表面之前传播的距离有关的信息,然后对阴影贴图进行采样,以便计算光线射中的游戏对象的实时阴影。
有关阴影贴图的更多信息,请参阅关于阴影贴图 (shadow mapping) 的 Wikipedia 页面。
为了计算阴影贴图的分辨率,Unity 会进行以下工作:
确定光源可以照亮的屏幕视图区域。方向光可以照亮整个屏幕。对于聚光灯和点光源,该区域是光源边界形状(点光源为球体,聚光灯为锥体)在屏幕上的投影。投影形状在屏幕上具有宽度和高度(以像素为单位);然后采用这两个值中的较大者。这个值就称为光源的像素大小。
执行以下计算,然后将结果确定为最大大小:
光源类型: | 公式: | 最大分辨率(以像素为单位): |
---|---|---|
Directional | NextPowerOfTwo (像素大小 * 阴影质量乘数 * 3.0) | 当阴影分辨率的质量为非常高时并且/或者如果 GPU 的 RAM 为 512MB 或更高,最高分辨率为 4096 x 4096,否则为 2048 x 2048。 |
聚光灯 | NextPowerOfTwo (像素大小 * 阴影质量乘数 * 2.0) | 如果 GPU 的 RAM 为 512MB 或更高,最高分辨率为 2048 x 2048,否则为 1024 x 1024。 |
点光源 | NextPowerOfTwo (像素大小 * 阴影质量乘数 * 1.0) | 如果 GPU 的 RAM 为 512MB 或更高,最高分辨率为 1024 x 1024,否则为 512 x 512。 |
点光源的大小下限比其他类型的大,因为它们对阴影使用立方体贴图。这意味着此分辨率下的六个立方体贴图面必须同时保存在视频内存中。渲染它们的成本也非常高,因为潜在的阴影投射物可能需要渲染到所有六个立方体贴图面中。
在内置渲染管线中,可以通过将 Light.shadowCustomResolution 属性设置为大于 0 的值来设置光源阴影贴图的分辨率。当该值大于 0 时,Unity 对所有光源类型都会执行以下计算:
NextPowerOfTwo (shadowCustomResolution)
然后会根据光源类型和硬件来确定最大分辨率,如上表所示。
注意,仅在内置渲染管线中支持 shadowCustomResolution
属性。高清渲染管线 (HDRP) 或通用渲染管线 (URP) 不支持它。