Files
BlueRoseNote/02-Note/演讲与教程笔记/虚幻开放日2025/《鸣潮》中的光线追踪:用光线构建动漫风格开放世界.md

4.5 KiB
Raw Blame History

title, date, excerpt, tags, rating, status, destination, share, obsidianUIMode
title date excerpt tags rating status destination share obsidianUIMode
《鸣潮》中的光线追踪:用光线构建动漫风格开放世界 2025-08-22 16:35:32 inprogress false source

Rtx

实现功能

  1. Rtx反射
  2. RtxGI
  3. RtxShadow

选型&快速验证

  1. 需求:
    1. 32km 32km
    2. 二次元
    3. TOD
    4. 4060 2k 60fps

方案:

  1. ReSTIR
  2. Lumen简略版砍掉一些不需要的过程
    1. GI
    2. Reflection
    3. 重新开发Clipmap Irradiance Cache来代替Surface Cache

ReSTIR

  1. 时间、空间重采样
  2. 计算光照
  3. 使用SHaRC、NRD降噪库。

SHaRC(Spatially Hashed Radiance Cache)

  1. 解决Multi-Bounce Problem
  2. 基于世界空间稀疏哈希的Radiance Cache
  3. 默认只有2次反射

NRD(Nvidia Real-time Denoising)

  1. 基于Spatio-Temporal的降噪器开箱即用。
  2. 用于最终降噪输出。
  3. 性能消耗较高4080 2k 2.3~3.0ms

缺点:

  1. 实现起来简单,光照效果好,但带宽性能压力大。
  2. 远处、边缘有噪点。

功能实现与迭代经验

ToonShading

案例1角色自阴影

  • 光栅化
    • 场景CSM
    • 角色PerObjectShadow
  • Rtx
    • 用剔除角色的InstanceMask做ToonShadowRay
if(IsToonShadingModel(ShadingModelID))
{
	RayTracingMask |=RAY_TRACING_MASK_SHADOW_NOT_TOON;
}

案例2角色接入GI

  • 角色渲染与场景氛围贴合
    • 角色需要接受环境反射的间接光
    • 提升角色效果的通透感
    • !WUWA_CharacterGI_1.png
  • 风格化场景
    • 高频的GI信息会破坏卡通渲染质感
    • 头发与面部先做球形法线处理
    • 角色整体法线朝向相机
    • 低成本平滑的间接光
float3 V = -GetCameraVectorFromTranslatedWorldPosition(TranslatedWorldPosition);
if(IsToonShadingModel(Material. ShadingID))
{
	Material.WorldNormal = normalize(lerp(WorldNormal, V, 0.5));
}

!WUWA_CharacterGI_2.png

  • 混合处理
    • 卡渲阴影下并非全黑,避免爆掉和效果异常
    • 将间接光转为HSV限制饱和度与明度
    • 乘上AO增加层次感
    • 穿日皮肤Mask皮肤见扫GI影响
half3 IndirectLightHSV = RGBToHSVHalf(DiffuseIndirectLighting);
IndirectLightHSV.b = lerp(0, 0.3, IndirectLightHSV.b);
IndirectLightHSV.g = clamp(0, Θ.35, IndirectLightHSV.g);

!WUWA_CharacterGI_3.png

案例3角色接入反射

  • 希望能够应用在金属特性的表面
  • 增加角色效果与环境的交互细节
  • 风格化处理
    • 粗糙度Clamp在0~0.3999避免转为SSR
    • 金属度当做反射强度超过0.9为镜面反射
  • 混合处理
    • 在Matcap基础上相加不影响本身金属效果

!WUWA_CharacterReflection_1.png

HybridShadow

  • Billboard和Imposter等物体需要阴影
  • 光追和光栅化不同无法分离ShadowPass和BasePass
  • 混合了 CSM + Ray Traced Shadow
  • 通过TileClassify减少Trace的像素

RaytracingShadows

  • 美术有时候会用单向Plane遮挡光照
  • 需要适配原有的美术资源的阴影逻辑
  • Shadow RayFlag:
    • RAY_FLAG_CULL_FRONT_FACING_TRIANGLES

VolumtricFog

  • VolumetricFog依赖CSM
  • 用ShadowRay预生成3D ShadowVolume
  • Inject Lighting用ShadowVolume判断Visibility
  • Hybrid Shadow可以用于性能优化,减少Trace物体解耦ShadowVolume和体积雾精度低端机性能分级

SingleLayerWater & Translucency

  • SLW需要水底颜色 +水底深度多Trace一条光线计算水底颜色和深度模拟散射
  • 和SLW一样多发射一条光线每层循环Trace手动Blend注意控制层数

Skybox

  • 鸣潮天空盒非常好看,但也非常复杂,反射里需要能看到天空(Very Important! ! )
  • 可以在RayMiss或HitT足够远的时候进行3~4次的Ray Traversal去手动Blend反射完整天空盒
  • 会造成非常严重的性能开销 !WUWA_SkyBox1.png

性能优化

Skybox Capture

Payload压缩

OMM & SER

  • Opacity Micro-Map (OMM)
    • 和光栅化不同光追中实现AlphaTest需要在AHS里计算Alpha
    • Encode TriangleVisibleState To BLAS
    • 黄色三角形才需要走AHS计算
  • Shader Execution Reordering (SER)
    • GPU上的计算尽量相似否则会产生Divergence问题
    • 做GI时光线方向非常发射材质计算复杂度也不尽相同
    • Nvidia推出SER的GPU Feature可以一定程度解决问题
    • 方向一致的计算提升不大,还会寄存器使用过多导致性能下降