杨雪青 NVIDIA 开发者技术工程师, 2019年12月18日
实时光线追踪基础
2
概要
光线追踪及算法简介
Classical Ray Tracing, Distribution Ray Tracing, Path Tracing, Photon Mapping
GPU光线追踪
光线追踪API,光线追踪GPU
游戏中的实时光线追踪特效
反射,阴影,全局照明, 焦散等
游戏引擎中的光线追踪
UE4, Unity
3
光线追踪及算法简介
4
什么是3D渲染?光线追踪
射线的数学定义
射线的原点(位置):O
射线的方向:D
射线上的任意点可表示为:P = O + t*D, t代表P与O的距离
5
光线追踪重心坐标
P0
P1
P2
A = A0 + A1 + A2P
A0 = 三角形P2P1P的面积
A1 = 三角形P0P2P的面积
A2 = 三角形P1P0P的面积A1
A2
A0
P = 射线与三角形P0P1P2交点
w0 = A0/A
w1 = A1/A
w2 = A2/A
(w0)
(w2)
(w1)
6
光线追踪重心坐标
(u0, v0)
(u1, v1)
(u2, v2)
u = w0 * u0 + w1 * u1 + w2 * u2
v = w0 * v0 + w1 * v1 + w2 * v2
P
(u, v)
7
光栅化
8
什么是3D渲染?光线追踪
9
什么是3D渲染?物体上的颜色从何而来?
直接光照
间接光照
自发光
10
1980: CLASSICAL RAY TRACING
Image now generated in real-time, in OptiX (was 74 minutes per frame in 1980)
11
CLASSICAL RAY TRACING
12
1980: CLASSICAL RAY TRACING
对于每个像素
• 从视点发射光线到场景
• 从交点向每个光源发射一条光线: shadows
• 为每次折反射生成新的光线
highly polished surface Generated using OptiX sample “optixWhitted”
13
1984: COOK STOCHASTIC (“DISTRIBUTION”) RAY TRACING允许Shadow Ray射向面积光上任意一点
允许在理想反射方向周围对Specular Ray进行扰动
在帧间某时发射以制作运动模糊。
glossy surface
14
STOCHASTIC RAY TRACING
15
Path Tracing: 发射光线并沿着光线的一系列相互反射进行跟踪
“渲染方程”
确保在光线数量达到极限多时能得到正确结果
1986: Kajiya-Style Diffuse Interreflection
diffuse surface reflection
16
渲染方程
出射亮度 自发光亮度 反射所有外部入射光线的亮度
BRDF
17
PATH TRACING
18
PHOTON MAPPING
从光源发出射线,追踪光子的行进路线
视点
焦散(Caustics)
19
如何用有限的采样次数来完成任务
蒙特卡洛采样积分+重要性采样 → 大量采样逼近真实解
实时渲染每像素至多几个采样(spp/samples per pixel)
低采样率导致噪点, 使用降噪器产生高质量画面
随机采样 + 降噪
20
GPU光线追踪
21
光线追踪软件接口
22
光线追踪API概览
光线追踪API与硬件
▪ DirectX Raytracing (简称DXR)
▪ DXR为D3D12的直接扩展
▪ 全新管线,包含光线追踪的专用Shader类型与资源
▪ 紧密结合传统光栅化与通用计算管线,易于实现混合渲染
▪ 通过D3D12已有机制进行提交和调度
▪ 与原有渲染管线共享资源,无需转换
▪ Vulkan Ray Tracing (简称VKRay)
▪ 使用扩展VK_NV_ray_tracing
▪ 全新管线,包含光线追踪的专用Shader类型与资源
▪ 紧密结合传统光栅化与通用计算管线,易于实现混合渲染
▪ 通过Vulkan已有机制进行提交和调度
▪ 与原有渲染管线共享资源,使用无捆绑模式(bindless)
▪ Khronos标准制定当中
23
光线追踪API:高层结构
光线追踪API与硬件
加速结构Acceleration Structures
着色器表Shader Table
光线追踪管线Ray Tracing Pipeline
资源Resources
光线求交调用TraceRay()
属性索引着色结果
24
光线追踪管线 (Ray Tracing Pipeline)
光线追踪API与硬件
1. 发射光线▪ 新Shader类型Ray Generation Shader
▪ DXR: DispatchRays(); HLSL: TraceRay()函数
▪ VKRay: vkCmdTraceRaysNV(); GLSL: traceNV()函数
2. 求光线与物体的交点▪ 遍历加速结构(Acceleration Structures)
▪ 新Shader类型Intersection Shader(可选)
3. 处理交点 — 进行着色,继续发射光线,等等▪ 新Shader类型Closest Hit Shader(可选)和Any Hit Shader(可选)
4. 处理无交点的情况 — 继续发射光线,或终止
▪ 新Shader类型Miss Shader
Hit Group
25
▪ AS是树形数据结构,用于加速光线遍历
▪ 两级层次结构
▪ 底层加速结构(BLAS): 对应单个物体,针对基本几何体信息(三角形及包围盒)
▪ 顶层加速结构(TLAS): 对应场景,存储多个BLAS的实例(Instance)信息,包括坐标变换数据、材质等
▪ AS由驱动创建维护
▪ 应用程序调用API进行管理
▪ 两种方式: 重建(Build),更新(Update)
DXR: BuildRaytracingAccelerationStructure()
VKRay: vkCmdBuildAccelerationStructureNV()
加速结构(Acceleration Structure)
光线追踪API与硬件
26
RayGen Miss
RayType 0
Miss
RayType 1
Hit
Geometry 0RayType 0
Hit
Geometry 0RayType 1
Hit
Geometry 0RayType 0
Hit
Geometry 0RayType 1
Hit
Geometry 1RayType 0
Hit
Geometry 1RayType 1
0 1 2 3 4 5 6 7 8 9 10
Instance A Instance B
InstanceContributionToHitGroupIndex
▪ 着色器表用于索引一次光线追踪中可能用到的所有资源
▪ 顶层加速结构(TLAS)中的节点指向着色器表中的对应记录
▪ 由多条等长的记录构成
▪ DXR:着色器表中可存放常量、resource view等数据
▪ VKRay:资源使用无绑定模式(Bindless),着色器表中只存放资源的全局索引
光线追踪API与硬件
Shader Record
Shader Identifier
uint64
uint
float
int
Shader Record
着色器表(Shader Table)
DXR
VKRay
27
光线追踪API:全景
光线追踪API与硬件
DispatchRays()
Hit Group
TraceRay
Shader Identifier
Local Root Arguments
Ray Generation
Shader
Ray Tracing
Pipeline
Shader Table
28
支持DXR与VKRay的GPU
光线追踪API与硬件
无RT Cores
简单的RT特效
光线数量少
有RT Cores
复杂的RT特效
同时运行多种特效
光线数量多
29
非RTX GPU软件模拟BVH遍历
30
TURING RT CORE使用硬件加速代替软件模拟
▪ 用于加速BVH遍历及光线与三角形的求交检测
31
TURING的光线追踪性能>10 Giga Rays
32
游戏中的实时光线追踪特效
33
光线追踪与传统渲染相结合
游戏中的实时光追特效
▪ 光栅化: 主要渲染流程,如前向渲染、延迟渲染
▪ 光线追踪: 次级光线效果,如反射、阴影
▪ 通用计算: 模拟,后处理
34
35
光追阴影
游戏中的实时光追特效
▪ 光追阴影的使用
▪ 广泛应用于传统阴影算法难以解决的面光源、点光源阴影
▪ 可用于多光源同时产生阴影
▪ 需要使用降噪器对结果进行处理
▪ 光追阴影的优势
▪ 产生精细的半影效果
▪ 在很多情况下性能优于传统阴影(UE4)
▪ 实现代码简洁
36
光追反射
游戏中的实时光追特效
▪ 反射是当前性价比最高的光追特效
▪ 具有传统SSR无法比拟的效果优势
▪ 单次光追反射可使用deferred shading
▪ 反射的应用场景
▪ 水体:海面、河流
▪ 天气效果:下雨场景,潮湿地面、墙面
▪ 材质:金属,瓷器,大理石,漆面,玻璃,冰面
37
光追GI与AO
游戏中的实时光追特效
▪ 光追GI的优势
▪ 实时更新,更好地支持动态物体
▪ 弥补传统SSGI信息不足的问题
▪ 有效解决传统GI的漏光问题
▪ 光追AO的优势
▪ 解决传统SSAO信息不足的造成的错误结果
图片来源:METRO EXODUS
38
光追焦散
游戏中的实时光追特效
▪ 光追焦散的优势
▪ 传统方法缺乏有效的实现方法
▪ 焦散性能较高,不涉及复杂的材质
▪ 准确反映与水面的交互
▪ 有效增加游戏的实时互动性
39
游戏引擎中的光线追踪
40
Unreal Engine 4
游戏引擎中的光线追踪
▪ 推荐使用版本UE4.24
▪ https://github.com/EpicGames/UnrealEngine/tree/4.24
▪ 修复了4.22以来的大量问题,并大幅提高了性能
41
UE4.24支持的主要光追特性
游戏引擎中的光线追踪
▪ 光追效果
▪ 反射, 折射, 阴影, 半透明, 环境光遮蔽(AO), 实时全局照明(GI)
▪ Path Tracing (离线渲染)
▪ 支持列表
▪ 光源: 直射光, 聚光, 点光, 天光, 面光, 图像光(IBL), 以及这些光源的阴影
▪ 材质: 普通, 无光, 双面, 函数
▪ 模型: static w/ wpo, skeletal, geometry cache, landscape, foliage, procedural mesh
▪ 粒子: Niagara (sprite, ribbon, mesh)
42
Unity
游戏引擎中的光线追踪
▪ Unity 2019.3 beta
▪ Ray Tracing in HDRP (Preview)
▪ HDRP = High Definition Render Pipeline
▪光线追踪特性
▪ 面积光软阴影,反射,半透明,AO,GI
谢谢!