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

149 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 《鸣潮》中的光线追踪:用光线构建动漫风格开放世界
date: 2025-08-22 16:35:32
excerpt:
tags:
rating: ⭐
status: inprogress
destination:
share: false
obsidianUIMode: source
---
- [[UFSH2025]《鸣潮》中的光线追踪: 用光线构建动漫风格开放世界 | 王鑫 库洛游戏《鸣潮》图形渲染组长] https://www.bilibili.com/video/BV1hSW4zTEgQ/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e
# 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
```c++
if(IsToonShadingModel(ShadingModelID))
{
RayTracingMask |=RAY_TRACING_MASK_SHADOW_NOT_TOON;
}
```
案例2角色接入GI
- 角色渲染与场景氛围贴合
- 角色需要接受环境反射的间接光
- 提升角色效果的通透感
- ![[WUWA_CharacterGI_1.png]]
- 风格化场景
- 高频的GI信息会破坏卡通渲染质感
- 头发与面部先做球形法线处理
- 角色整体法线朝向相机
- 低成本平滑的间接光
```c++
float3 V = -GetCameraVectorFromTranslatedWorldPosition(TranslatedWorldPosition);
if(IsToonShadingModel(Material. ShadingID))
{
Material.WorldNormal = normalize(lerp(WorldNormal, V, 0.5));
}
```
![[WUWA_CharacterGI_2.png]]
- 混合处理
- 卡渲阴影下并非全黑,避免爆掉和效果异常
- 将间接光转为HSV限制饱和度与明度
- 乘上AO增加层次感
- 穿日皮肤Mask皮肤见扫GI影响
```c++
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可以一定程度解决问题
- 方向一致的计算提升不大,还会寄存器使用过多导致性能下降