- CGPC2024 第二日
- 日程安排:https://cgpc2024.github.io/about.html
离线渲染:真实感材质建模
王贝贝,NJU
科研大佬!
- 材质模型的基本概念
- 几种常见材质模型
材质模型近期进展
材质:定义了渲染方程中的BSDF(BSDF = BRDF + BTDF)
- Diffuse、Glossy、Specular
- 前沿:(微结构)表面模型(电梯、茶壶的金属表面)、织物模型
BRDF
- 定义在局部坐标系,以着色法向
为z轴 - BRDF:出射的Radiance(辐亮度)和入射的Irradiancce(辐照度)的微分之比
- 定义:
- 辐照度Irradiance:单位面积的辐射通量
- 辐射率/辐亮度Radiance:单位面积、单位立体角的辐通量密度
着色法向 vs. 几何法向
几何法向:三角形面法向
顶点法向:所有相关联的三角形面的法向的平均
着色法向:定点法向插值后的法向
- 重心坐标
- 着色法向由于插值,可以近似光滑
方向参数化
直角坐标
BRDF的不同参数化形式(在神经网络上十分重要)
- 入射方向 + 出射方向
- 半程向量
+ 差向量 - 各向同性BRDF
,4D->3D
讨论范畴
- 几何光学与
波动光学:材质细节与光的波长相当时,进入波动光学范畴- e.g: 黑色狗毛呈现彩色
- 表面渲染与
体渲染:- 表面材质模型:入射出射为一个点
- 次表面散射:光线在介质内传播,吸收、散射导致出射点多个
- 渲染方程 -> 辐射传输方程(RTE)
- 扩散理论
常见材质模型
- 标准
- 真实性
- 计算高效性
- 存储简洁性
- 表达统一性
- 物理性:能量守恒、可逆性
- 白炉测试:材质球在纯白环境光下,如果与背景融为一体则能量守恒
- 可逆性:
与 互换不变 - 不强制要求,但需要考虑衡量
- 重要性采样便捷(便于生成PDF)
- 可编辑性
测量模型
- 每个材质:
到BRDF值的数据表格 - MERL数据集(2003)
- Pros: 真实性强(真实摄制)、计算高效、表达统一
- Cons: 存储不简洁、编辑困难、不具物理性、PDF只能用累积分布函数
解析模型
- 经验模型 / 基于物理的模型
- Lambertian
- Diffuse: 视角无关,
为albedo/base color
- Diffuse: 视角无关,
- Blinn-Phong
- 真实性:分布简单,塑料感
- 高效、简洁、易于编辑
- 表达效果不统一
- 能量不守恒,有可逆性
- PDF:解析公式
- 微表面模型 Microfacet Model
- 认为表面由多个微小面元构成
- NDF - 法向分布函数
:Beckmann, GGX, GTR - 参数:粗糙度(roughness)
- GGX常用,GTR拟合更好,但打破了拉伸不变性(面积与roughness的关系)
- Shadow Masking - 遮挡函数
- 有多少比例的微表面可以同时被入射和出射观察到
- 相同的 NDF 可以得到不同的微表面 - profile
- Smith模型、V-Groove模型
- Smith假设:高度分布与法向分布无关
- 高度无关遮挡函数
- ref: https://pbr-book.org/4ed/Reflection_Models/Roughness_Using_Microfacet_Theory#TheMaskingFunction
- 菲涅尔项
- 光线在两种不同折射率的介质中传播时的反射比例
- 金属:接近1,贴地角出反射更强
- 非金属:垂直入射处折射为主,贴地角处反射变强
- 与界面折射率(IOR)有关,与材质的物理属性有关
- 金属的IOR是复数,常规折射率
和消光系数
- 金属的IOR是复数,常规折射率
- 计算开销:需要考虑偏振,与光线波动性有关
- 实时渲染:Fresnel Schlick 近似
- 没有漫反射项、金属度
- Cook-Torrance模型:Lambertian + 微表面
- Disney Principled BRDF
- 广泛应用于UE、Blender等
- 真实性:在金属、粗糙玻璃有真实感,无法模拟视差、双高光
- 高效性:实时渲染需要近似
- 无法表达纤维材质,高光分布不同
- 有解析解,但每种NDF需要特定的PDF采样
其他BRDF
4D -> 6D 增加了uv维度
- SVBRDF
- BTF
近期进展
- 传统方向
- 微表面模型多次散射
- 微结构模型(存储开销)
- 多层材质模型(SpongeCake)
- 布料、皮肤、头发
- AI + 材质
- 神经网络材质表达
- 材质推导和重建
- 展望
- Physics vs. Data
- 材质模型何时统一:surface & volume
- From microfacets to participating media: A unified theory of light transport with stochastic geometry. SIGGRAPH 2024
- 材质 + AI
当代游戏引擎光照与几何处理前沿技术
王希,不鸣科技
- 现代游戏要60FPS,10-30ms生成1frame
- 工业界实现了大量的hack
- MCRT -> Reflective Shadow Maps,Ray Marching
- LPV:
- SVOGI & VXGI:体素化全局光照(前者采用八叉树)
- SSGI:屏幕空间全局光照,开销小
Lumen
- 开销最大、最不稳定的问题:Visibility(Ray Trace),每个像素只能承担1/2根ray
- 空间体素存储光照信息,Screen Probe Structure
- 世界空间 Radiance Cache
- 把各种算法在不同情况下结合起来
- Nanite - Skipped
ReSTIR GI
- ref:https://research.nvidia.com/publication/2021-06_restir-gi-path-resampling-real-time-path-tracing
- e.g: Cyperpunk 2077,得到工业界认可
- 基于GPU RT
- 高频采样BRDF,低频采样Visibility
展望
看起来对的就是对的
从PBR到AI: Data Driven,Neural Network based Material
交流环节
Unity vs. Unreal
- 并行化问题:UE和Unity仍是几十年前的古典架构,没有太多区别
- 主线程 + 其他线程
- 用一些Trick处理并行化的问题(物理模拟、Gameplay AI等),类似 Vic3 的多核优化
- 引擎魔改问题
- Unreal高度集成化,底层C++,对于引擎的修改大多数是直接修改源码
- Unity大多数情况可通过暴露的C#进行修改,大厂会养自己的团队魔改底层;更利好个人开发者
- Nanite:主要问题在于显存带宽而非算力
脚本选型
- Apple的更新政策,导致更多开发者倾向采用脚本作为资产的方式开发,以规避更新审核
- Lua vs. Python
- Lua: 轻量化、效率较高
- practice: Roblox
- Lua-jit,但最初开发者神隐了
- Luau:强类型的Lua,类似TS和JS
- 个人更倾向Lua
图形API
- DX12 vs. DX11:12更底层,上限更高,可以魔改pipeline(可以在传统vertex-fragment基础上修改流水线)
- Vulkan:类似于DX12,更加底层,同时难度也更高,目前正在适配移动端,属于未来的技术
光线云:云原生实时渲染引擎 - RaysEngine
王锐,ZJU,光线云
公司背景
ZJU CAD&CG,基于渲染技术在工业界发展
EAR制裁(0%美国技术可用)
技术背景
Web 3.0:个人化时代
XR、三维可视化
端云协同的渲染
端云协同引擎
- https://www.raysengine.com/solution/editor
- 在线编辑 + 在线素材管理
实时渲染:GPU与渲染流水线
王锐,同上
概述
求解渲染方程
- Path Tracing
- 有限元方法,Radiosity
实时
- 传统:30FPS
- VR:90FPS
- 晕3D问题:可能需要更高的刷新率
- Local Shading:只算直接光:
渲染管线
Rendering PPL
- 历史:Geometry Engine(SGI 1982) -> Voodoo -> NVIDIA GeForce RTX 4090
- 图形工作站 -> 2D图形计算卡 -> 3D显卡
早期阶段
- Model -> Vertices -> Pixels -> Color Pixels
- Transform&Lighting -> Rasterizer -> Shader
- CPU应用 -> 系统调度 -> GPU
固定管线
固定函数绘制流水线(Fixed-function Rendering Pipeline)
早期~2000
- 1992,SGI成立OpenGL
- Vertex -> Fragment -> Blending
- Model: Modeling, Vertex-Shading, Transformation, Clipping(裁剪)
- Screen Vertices: Projection, Rasterization
- Pixels: Visibility
- 一个Pixel可能有多个Fragment,故OpenGL命名为Fragment
可编程管线
核心问题:Vertex、Fragment阶段的自定义
Programmable Shaders
发展:GPGPU(General-purpose GPU),发展到CUDA,利用GPU并行能力
着色阶段发展
- 几何着色器(Geometry Shader): 在 Vertex 和 Fragment 中间
- Tessellation Shader(细分曲面着色器)
Graphics API
- OpenGL
- 最新版本:4.6,已停止演化
- OpenGL ES - 移动端
- 基于 OpenGL 4
- Version 3.2
- Shader based
- WebGL - 浏览器
- 基于 OpenGL 3.0
- 发展历史
- 2.0 - 可编程管线
- 3.2 - 几何着色器
- 4.1 - Tessellation Shader
- 可拓展插件:Mesh Shader
- WebGPU
- W3C维护,发展中
- Vulkan
- 最新版 Version1.3
- Vulkan vs. OpenGL
- 应用负责内存、线程等管理
- 上手难度大
- Driver通用性
- DirectX
- Windows
- 跨平台性差
- 非向前兼容
着色语言
RenderMen: 2019 Turing Award
- 辐射度算法,引入了着色语言(Shading Language)
HLSL、GLSL、MSL(Metal)、WGSL(WebGPU)
- C Styled
- SPIR-V Toolchain
- 从不同着色语言转为跨平台API调用
GPU光追
- 2018,NVIDIA RTX
- Previous: OptiX
- 发布了 Mesh Shader、RTCore
实时渲染方法
王璐,山东大学
Shadow Mapping
- 2-pass Algorithm
- Light pass: 从Light方向看去得到深度图
- Camera pass: 着色点投影到光源矩阵下,比较1st pass的深度
- Vertex: 着色点对光源作变换
- Fragment: 根据深度图作Visibility test
- Shadow Acne
- 阴影自遮挡问题
- 方案1:前向面和后向面都做一次着色,计算平均值得到深度图(开销大)
- 方案2:得到深度图过程中,一个bias的着色(可能会漏光)
- 高分辨率问题
- 方案:在视锥中不同区域绘制同样分辨率的材质(近处阴影细节多,远处阴影细节少)
- Soft Shadow
- ref: https://yangwc.com/2021/04/14/PCSS/
- 光源非点光源
- 区域对光源完全不可见:本影
- 区域对光源部分可见:半影
- PCF(Percentage-closer Filtering)
- 2Pass中,查询着色点周围一圈区域(Filter)
- 受Filter Size影响
- PCSS
- 本质:自适应边缘的PCF
- Step1: 进行一个固定大小的查询,算出周围遮挡体深度的平均值
- Step2:计算半影半径
- Step3:PCF
- VSSM
- 切比雪夫不等式
- 借助Mipmap/SAT生成阴影纹理
- 问题:漏光、存储开销变高(深度图、深度图平方、Mipmap)
- DFSS
- Ray Marching:基于SDF
- UE 应用
- Shadow Map
- Virtual Shadow Map
- SDF
- RT + 去噪
- 预计算 / 动态GI
3D Space GI
- 开销小:One-bounce
- PRT(Precomputed Radiance Transfer)
- https://yangwc.com/2021/04/29/PRT/
- 基函数拟合
- 不适合动态场景
- VXGI(基于体素的GI)
- 体素存储
- 八叉树:很难在GPU上存储
- Clipmap:不同LOD存储不同数目体素
- 1st pass: Light pass,获得次级光源注入体素
- 2st pass: 根据着色点查询周围的Cone中的体素,累计间接光
- 漏光、遮挡问题(体素内部不考虑可见性)
- 体素存储
- Light Map
- 预烘培光照贴图
- Light Probe
- DDGI
Screen Space GI
SSAO
AO:渲染方程中Visibility项
- 在屏幕空间中,判断每个像素表面周围(法向半球体)采样点是否落在模型内部
- 根据外部点/内部点的比例计算遮挡系数
SSR
【没懂】
- 在边缘处作一个滤波避免割裂
Real-time RT
- Graphics API + Hardware
- 目前只能承担1SPP
- 取上一帧的大量数据去噪(TAA)
- 鬼影、遮挡问题
插帧、超分:Tensor Core 利用网络生成高分辨率结果
Nvidia Real-time Denoiser(NRD): 非网络
- Nvidia DLSS
研究进展
- Neural Basis Function for PRT
- Real-time Woven Fabric Rendering
- VR中适用SSR:左右眼显示效果不一致,提出了一致性处理方法
展望
- 复杂几何体:动物皮毛等复杂结构难以用Nanite处理
- 复杂材质
- 复杂光源
- 更多次弹射的GI
- 去噪:快速运动场景中可用信息很少,如何去噪
高质量LBVR应用研发分享
XVERSE元象
LBVR简介
- Location-based VR,沉浸式,在特定地点提供沉浸式体验
- 幻旅之门项目
- PICO & Quest: Android平台
- Vision Pro:闭源,暂不支持UE
VR性能优化
性能要求:90FPS,晕动症问题
Meta: ASW(Application SpaceWarp)
- 插帧实现高帧率
- UE插件支持
模型减面
- 边折叠:QEM
- 顶点合并, etc.
QEM
- 收缩一条边,收缩一条边上的两个顶点,设定收缩阈值,计算损失矩阵
- 停止迭代:豪斯多夫距离
- 问题:效果不可控、没有结合业务现状(减面效果与视角无关)
- 方案:加入剪影Loss
手势追踪绑定
- 交互动作:适配不同模型的人物需要调整
- 手K
- 基于视觉的动捕(不成熟)
- 动捕设备
资产优化
UE PSO(Pipeline State Project)
- 降低第一次打包时卡顿
- 设置开启PSO采集->打包->运行采集->转换缓存->重新打包
双目视频压缩
全景图(球形、立方体),双目视差
MV-HEVC
- 存一个视角的信息+另一视角的部分信息