1 问题阐述
项目在采用常规角色自阴影渲染方案时发现,在相同Shadowmap分辨率条件下,当前角色自阴影渲染方案的阴影精度与《崩坏:星穹铁道》《燕云十六声》等游戏存在明显差距。主要表现为两类视觉缺陷:
- 阴影闪烁(Shadow Flickering):动态场景下阴影边缘出现不稳定抖动
- 阴影锯齿(Shadow Aliasing):离散化采样导致的阶梯状边缘 artifacts
2 优化方案综述
为了改善阴影闪烁和阴影锯齿的问题,通常会有三种技术途径
| 方案 | 优势 | 局限性 |
|---|---|---|
| 提升Shadowmap分辨率 | 方法简单暴力效果好 | 显存消耗呈平方级增长 |
| 改进软阴影算法 | 提升视觉平滑度 | 无法解决基础采样精度问题 |
| 优化Shadowmap利用率 | 保持分辨率不变提升有效采样密度 | 需要复杂空间划分算法 |
Shadowmap利用率η为:
η = (可视区域投影面积) / (Shadowmap总纹素数量)
本文聚焦第三种方案,通过提升纹素有效利用率实现精度优化。
3 Shadowmap利用率优化方案
Shadowmap利用率优化方案通常有两种,第一种是基于距离的包围盒调整方法,第二种基于视锥体求交的方法。第三种方法是作者提出的新方法,基于骨骼层级树的包围盒算法。
接下来将依次介绍这三种方法。
3.1 基于距离的包围盒调整方法
原理:建立摄像机距离d与包围盒尺寸的负相关关系
Bnew=Boriginal×(1+kd2)
其中,Boriginal是角色的初始包围盒尺寸,Bnew是调整后的包围盒尺寸,d是摄像机到包围盒的距离,k为可以调整的系数。
参数设计原则
- 距离衰减(d²项)
- 采用平方反比关系模拟自然光照衰减特性
- 当d→0时(特写镜头),包围盒快速扩大以保证细节覆盖率
- 当d→∞时,趋近于原始包围盒尺寸
- 系数k的调参方法
- 经验取值:一般初始设置为角色高度平方(如角色高1.8单位→k≈3.24)
- 动态校准:
# 自动校准算法伪代码
while shadow_quality < target:
k += 0.1 * (current_utilization - target_utilization)
render_test()
优劣分析:
- 优点:实现简单,角色动作幅度不大时效果好
- 缺点:需要逐角色调参(k值敏感)
- 适用场景:固定视角,角色少

1347

被折叠的 条评论
为什么被折叠?



