Unity中的阴影大小计算浅析

2015年03月16日 13:47 0 点赞 0 评论 更新于 2025-11-21 17:19

阴影大小计算

在Unity中,计算阴影贴图大小的方法如下:

1. 计算屏幕上灯光的“覆盖范围”

灯光在屏幕上照亮的矩形范围取决于灯光类型,具体如下:

  • 方向(Directional)灯:照亮整个屏幕。
  • 聚光(Spot)灯:照亮灯光投射到屏幕的圆锥型包围矩形。
  • 点(Point)光源:照亮灯光投射到屏幕的球形包围矩形。

2. 选择范围的宽和高的较大值,并调用像素大小

3. 根据阴影分辨率确定阴影贴图大小

高(High)阴影分辨率

  • 方向(Directional)灯:阴影贴图的大小为 NextPowerOfTwo(像素大小 * 1.9),但不超过 2048。这里的 NextPowerOfTwo 函数是用于获取大于或等于给定数值的2的幂次方的数值。
  • 聚光(Spot)灯:阴影贴图的大小为 NextPowerOfTwo(像素大小),但不超过 1024。
  • 点(Point)光源:阴影贴图的大小为 NextPowerOfTwo(像素大小 * 0.5),但不超过 512。

当图形卡有 512MB 或更高显存时,阴影贴图的上限会增加,方向(Directional)灯为 4096,聚光(Spot)灯为 2048,点(Point)光源为 1024。

中(Medium)和低(Low)阴影分辨率

  • 处于“中(Medium)”阴影分辨率时,阴影贴图的大小比“高(High)”阴影分辨率的贴图小两倍。
  • 处于“低(Low)”阴影分辨率时,阴影贴图的大小比“高(High)”阴影分辨率的贴图小四倍。

4. 点(Point)光源低限值的原因

表面看来,点(Point)光源的低限值是因为使用了立方体阴影贴图。这意味着处于该分辨率的六面立方体贴图必须存在于显存内。在渲染时,这非常耗费性能,因为潜在阴影投射器必须渲染到最多六面立方体贴图上。

接近显存限值运行时的阴影大小计算

当接近显存限值运行时,Unity 会自动降低上述计算的阴影贴图分辨率。

一般来说,屏幕内存(包括后台缓冲、前台缓冲、深度缓冲)和渲染纹理内存位于显存中。Unity 会使用这两项来确定阴影贴图允许的内存使用量。根据前面计算的大小分配阴影贴图时,其大小将减少,直至适合 总显存 (TotalVideoMemory) – 屏幕内存 (ScreenMemory) – 渲染纹理内存 (RenderTextureMemory) / 3

需要注意的是,假设所有常规纹理、顶点数据和其他图形对象可从显存中换出,阴影贴图可使用最大 VRAM 为 总显存 (TotalVideoMemory) – 屏幕内存 (ScreenMemory) – 渲染纹理内存 (RenderTextureMemory) / 3。但屏幕和渲染纹理占用的确切内存量无法确定,并且某些对象无法换出。如果所有纹理总是换进换出,性能会变得很差。因此,Unity 不允许单个阴影贴图超过“一般可用”显存的三分之一,这一规则在实践中效果良好。

作者信息

menghao

menghao

共发布了 3994 篇文章