角色阴影
全库目录221
本文目录6
刘海投影既要跟随头发,也要保持脸部可读。普通阴影贴图、专用遮罩、屏幕偏移和射线求交保存的信息不同。我们先确定投影对象和消费者,再按角色距离、平台与画面档位选择。
角色遮挡与阴影
头发投脸阴影
Face SDF 描述脸部设计明暗分区,不能准确处理刘海。头发投影可以使用:
- 普通阴影贴图;
- 单独头发投影通道,把头发深度/遮罩投到 Face;
- 屏幕空间偏移阴影;
- 美术绘制的固定 Hair 阴影遮罩。
阴影贴图物理关系较完整,但 Bias、分辨率和 PCF 会影响细线。Screen-space 偏移便宜且可控,却会随 FOV、头部旋转和遮挡穿帮。
专用头发投影通道可以只让头发写入角色局部阴影遮罩,再由脸材质采样。需要用 Stencil/ID 防止投到场景或其他角色,并处理透明发片与 Alpha 裁剪。
深度偏移法
延迟路径下有一种成本很低的做法:在计算面部着色时,把当前像素的屏幕坐标沿光照方向偏移一段,采样偏移处的深度,若该处存在头发(靠材质分类 ID 判断)且深度更近,就判定当前像素处于刘海投影中。
它的本质是在屏幕空间做一次单步的光线步进。前提是能够区分头发与面部——这正是材质分类 ID 或专用缓冲的用途。
三个必须处理的问题:偏移量需要随深度缩放,否则远处角色的投影会过大;偏移方向应来自光方向在屏幕空间的投影,而非固定方向;单次采样会产生硬边,需要多次采样或与 SDF 结果混合。
穿帮场景是可预期的:头发被其他物体遮挡时深度信息丢失;侧面视角下屏幕空间偏移与真实几何关系脱节;FOV 变化会改变偏移的视觉尺度。
屏幕候选的深度判据
取面部世界位置 P,沿指向光源的单位方向 L 移动一个世界长度 h,得到候选点 Q=P+hL,再把 Q 投影到屏幕。使用透视除法后的 UV 采样头发 ID 和正线性深度,不能把世界方向 XY 直接加到 UV。
Q = facePositionWS + towardLightWS * testDistanceMeters
uvQ = ProjectToUV(Q)
if uvQ outside viewport: visibility = 1
else:
depthQ = PositiveViewDepth(Q)
hairDepth, id = LoadNearestSurface(uvQ)
blocked = (id == thisCharacterHairId) and (hairDepth < depthQ - bias)
visibility = blocked ? 0 : 1例如Q的正观察深度为5米,候选最近表面为本角色头发、深度4.8米,bias为0.01米,判据成立;若4.8米表面属于另一角色则拒绝。即使ID与深度均满足,头发可能位于候选射线前方而没有穿过P到Q的光线段,这正是单样本近似的假阳性来源。
这只是一次屏幕候选测试:采到更近的头发并不证明光线段真正穿过它,厚度与侧视误差仍存在。h 越大,候选离面部越远,误匹配的范围也越大。使用多个样本可以缓和边界,但无法恢复离屏头发;因此它作为艺术近似,并用真实阴影贴图对照诊断。
光追投影
支持硬件光追时,可以从面部像素向光源发射阴影射线,只与头发几何求交。它使用实际头发几何求可见性,减少阴影贴图分辨率和离屏信息缺失的问题;薄发片、Alpha处理、自相交与低样本噪声仍需限定。
代价很直接:需要为角色维护加速结构、每帧更新蒙皮后的几何、承担光追本身的性能与硬件门槛。通常只在高配档位启用,低配回退到深度偏移或阴影贴图。
方案条件
| 方案 | 准确性 | 成本 | 主要问题 |
|---|---|---|---|
| 普通阴影贴图 | 几何正确 | 中 | Bias 与分辨率影响细发 |
| 专用头发投影通道 | 几何正确、可控 | 中 | 需要额外 Pass 与分类 |
| 深度偏移 | 近似 | 低 | 视角与遮挡穿帮 |
| 模板偏移 | 近似 | 低 | 同上,且形状受模板精度限制 |
| 美术绘制遮罩 | 完全可控 | 极低 | 不随光照变化 |
| 光追 | 几何正确 | 高 | 硬件门槛与加速结构维护 |
选择取决于画面档位与角色重要性。可以按角色重要性与平台预算分档,实际成本和画质在同一场景比较。
角色阴影贴图
PCF/PCSS的滤波与半影机制见 Shadow Map。角色页只选择过滤尺度、Bias区域和艺术重映射。
角色 NPR 不一定追求物理软阴影。常用控制:
- 固定或量化 Filter Radius,保持动画片色块;
- 给脸、头发和身体不同 Bias;
- 用阴影 Ramp 重映射可见性;
- 限制自阴影区域;
- 主光使用高质量阴影,附加光不产生复杂色块。
Bias 过大造成悬浮阴影,过小产生自阴影条纹。法线偏移还会让细脸和发片轮廓偏移,必须近距离检查。
验证方法
分别显示头发遮罩、角色局部深度与最终阴影,测试侧视、被遮挡头发和FOV变化。通用PCF/PCSS与Bias机制以阴影贴图为主归属,角色页只说明过滤尺度和区域控制。
相关主题
参考资料
- Microsoft:Texture2D.Load:纹理按整数坐标读取的接口语义;本文角色深度/ID与世界偏移方案为独立设计,不归属于特定商业作品。