高质量实时渲染

学习games202时,整理的笔记。
关于games202,我认为是讲到了一部分相比于games101进阶的实时渲染的东西,也涉及到了一些真正学术前沿的东西。但是想要仅仅通过这一门课了解实时渲染还是远远不够,其中不少内容也只是仅仅提了一下概念和思路,离具体实现还有不少距离。不过,闫老师讲的非常通俗易懂和有意思,单纯这一点就值得一听。

进阶 shadow map

由于shadow map对深度测试时,难免会由于精度导致地面有自遮挡,此时可以增加一个bias。

但是,由于增加了这个bias,就又会导致离地面近的遮挡没法被计算进去。

总之,就是由于shadow map的分辨率不够,而产生的走样

percentage closer filtering (PCF)

基本思想:把原本shadow map要做的对于一个点的深度测试改为对于周围一些点的深度测试

对于周围几个点比较深度并平均(而非对最终的阴影或者shadow map作模糊)

Percentage Closer Soft Shadows (PCSS)

在使用PCF的过程中发现,如果PCF取的周围采样点的范围较大时,正好可以作出软阴影(由于光源是由宽度的,导致遮挡物越远离被遮挡物时,阴影越模糊)的效果。

pcss.png

图中可以看到,想要知道W_penumbra,需要知道d_receiver

于是,PCSS的过程可以分为三部分

  1. 根据某个采样大小计算某位置是否被遮挡,若被遮挡,计算平均d_receiver
  2. 根据d_receiver计算应该对该点使用的采样大小W_penumbra
  3. 作以W_penumbra为采样半径的PCF

Variance Soft Shadow Mapping (VSSM)

PCSS的第一步和第三步太复杂,于是发现可以不对范围内所有点采样,而是使用随机采样(有噪声)

从另一个角度来说,PCF的目的就是求出一个范围内百分之多少的深度比shading point中的深度要浅,我们可以将这个比例认为是正态分布的。
于是,我们只需要求出均值和方差即可。
其中均值可以使用mipmap/二位前缀和来计算
方差可以用 V(X) = E(X^2) - E^2(X) 来计算,其中E(X)已经算出来,只需要平方,而E(X^2)可以在渲染Shadow Map时就多存一张X^2的图

有了方差和均值就可以用CDF(X) 或 Erf(X)误差函数来求那个x对应的所需要的比例 或者直接查表

更大胆的假设,引入切比雪夫不等式:vssm.png
(实时渲染领域喜欢把不等式当作近似相等来用) 回答了t不会超过百分之几的问题(只能算t位于右半边的情况)

缺陷:如果分布的峰值多于一个(无法用切比雪夫以及正态分布来估计了)会产生漏光现象

Moment Shadow Mapping (MSM)

思路:使用更高级的函数来表现某一种分布

Distance field soft shadows

SDF:signed distance function 描述空间中的任意一点到最近的物体间的距离(非常好用,可以用来做几何上的过渡,也可以用来做ray-matching)
快的一批的同时效果还好,唯一的缺点是需要3维上的存储空间

以ray-matching举例:从一个shading point出发,可以向光线传播的方向“安全地”前进该点的SDF值,到达那个点时,又可以同理继续向光线传播方向“安全地”前进,由此实现ray-matching

当SDF应用到阴影领域中,sdf.png
求shading point O即是计算min(θ1,θ2,θ3) 该值越大,收入到的光照越多,越“白”;该值越小,收入的光照越少,越“暗”
该角度 = arcsin(SDF(x)/(P-O)) 可以简化为 min(k*SDF(x)/(P-O), 1.0) (还可以用k值来调节软阴影的强弱)

Environment Lighting 环境光照

Shading from environment lighting (不考虑环境光照产生的阴影的情况)

环境光贴图

只能默认是光照从无限远来

Image-Based Lighting(IBL)解rendering equation

  1. 把light分量拆出来
    IBL1.png

方框中相当于对light分量进行滤波

IBL2.png

将需要采样的值(左图) 转化为 直接查询对应点的值(滤波完已表示一块的范围)

  1. 针对某一种BRDF

IBL3.png

可以将BRDF转换成了R0(粗糙度)与θ(角度)两个自变量的结果,由此可以预处理出一张对应不同R0和θ对应的值的表,查表来算

Shadow from environment lighting (计算了阴影的环境光照)

很难(光源太多时只计算最强几个光)

引入知识:product_integral 用于近似

product_integral.png

上式可以认为是某种滤波,f(x),g(x)其中一个是低频时,则结果是低频

引入知识:Spherical Harmonics 球谐函数

sh.png

一系列的基函数,用于表示任意的球面函数
求每个基函数系数的过程也称投影

应用于预计算
sh2.jpg

球谐函数的特性:某个基函数的旋转可以表示为同一阶(上图中l相等)其他几个基函数乘以参数
缺点:只能用于固定场景,光源一变化就需要重新计算虚函数

Precomputed Radiance Transfer (PRT)

prt1.png

将 rendering equation 写成 lighting、visibility、BRDF 三项

lighting是球面函数、visibility也是球面函数、BRDF也可以描述成球面函数

然后就使用预计算算出这三项

原视频还提到了如何计算diffuse的prt和glossy的prt

以及还有许多能代替SH表示球面函数的基函数,如wavelet对于高频效果更好

实时全局光照

核心问题是解决一次间接光照

Reflective Shadow Maps (RSM)

假设接收到直接光照的物体假设为diffuse的

Light Propagation Volumes (LPV)

把空间分成许多个立方体,认为单个立方体内部的环境光强度均等

Voxel Global Illumination (VXGI)

用层级树来将空间划分为许多立方体,计算light ray以及camera ray

Real-Time Global Illumination (screen space) 屏幕空间内的全局光照

共有的缺点:可获取的信息局限于屏幕空间内

Screen Space Ambient Occlusion (SSAO)

屏幕空间环境光遮蔽
对于某个点,在点朝向摄像机的180°范围(半径一定范围)内,有多少被挡住,挡住的越多,要加的阴影越多

超越屏幕空间的环境光遮蔽(HBAO)

Screen Space Directional Occlusion (SSDO)

对于某个点,在点朝向摄像机的180°范围(半径一定范围)内,有多少没被挡住(无限长),挡到的越少,间接光越多

Screen Space Reflection (SSR)

相当于在屏幕空间内做光线追踪
需要有法线信息的G-Buffer

难点在于做linear raymatch
对于一个shading point,camera ray通过法线反射的方向每次前进一个小距离,看看这个位置有没有被挡到(被挡到的点认为对这个shading point有间接光的贡献)

优化:Hierarchical ray trace(用类似mipmap的思路)

Real-Time Physically-Based Materials (surface models)

基于物理的材质

Microfacet BRDF (微表面模型)

pbr1.png

Normal Distribution Function (NDF)

Beckmann 法线分布
pbr2.png

ggx:更长的拖尾,更平滑
pbr3.png

Shadowing-Masking Term

一起算太复杂,拆开成shadowing项和masking项
pbr4.png

由于microfacet模型中会相互遮挡,导致较粗糙时有一部分光照强度是内部的间接光照贡献的(一般被忽略了),导致叫粗糙时会比较暗

使用 The Kulla-Conty Approximation 把损失的光照补回来
pbr5.png
其中 E_avg只和粗糙度相关,E(μ)和粗糙度和μ(角度)相关,可以打表预计算

当microfacet模型有颜色项的时候,需要再乘以
pbr6.png
其中F_avg来自于菲涅尔项
pbr7.png

Disney’s Principled BRDF

正常的BRDF用起来不好用,艺术家们不懂物理

pbr8.png

Linearly Transformed Cosines (LTC)

用于多边形光源的方法

Non-Photorealistic Rendering (NPR)

Real-Time Ray Tracing (RTRT)

现在的显卡水平可以达到1SPP path tracing =
1 rasterization (primary) +
1 ray (primary visibility) +
1 ray (secondary bounce) +
1 ray (secondary vis.)

Tempora denoise

根据前几帧降噪这一帧
计算motion vectors

rtrt.png

缺点:没法“倒着走”、有拖影、切换镜头时效果差、无法对阴影、反射等产生作用

其中拖影可以用减少前几帧的权重减轻

filter

高斯滤波,去高频,留低频

Bilateral Filtering (双边滤波)

认为颜色差别特别大时,则认为是边界,不相互产生贡献

Joint Bilateral Filtering (联合双边滤波)

特别适用于RTRT,蒙特卡洛的结果

需要利用渲染时产生的G-Buffer(一般考虑depth、normal、color等)

大范围滤波的实现

1.
rtrt2.png
先横着做一次1 * N的滤波,再竖着做一次N * 1的滤波 (太大的不行,瑕疵会明显)

  1. rtrt3.png
    多次层级式的滤波(5 * 5大小),每次5 * 5的样本间间隔+1

Outlier removal

由于蒙特卡洛方法的作用,可能会有一些超级亮的点(>255),如果滤波范围较小,只会把这个点变成一块光斑

需要把这些outlier在滤波之前就处理掉

  1. 找到:用个7 * 7的大小,得到这些点的均值和方差

rtrt4.png

  1. 把这个点clamp到一个有效的范围内

Spatiotemporal Variance-Guided Filtering (SVGF)

考虑切平面的深度、法线的差异、
特别的部分:
rtrt5.png

SVGF中的V,方差项,如果这个区域的方差很大,则认为这个区域不值得考虑

Recurrent AutoEncoder (RAE)

神经网络的东西

Practical Industrial solutions

Temporal Anti-Aliasing (TAA)

将一个像素内分为四个,超采样,但是每帧只用其中一个感知,然后混合四帧的结果

DLSS 1.0/2.0

DLSS1.0 完全神经网络数据驱动、效果差
DLSS2.0 更多地使用Temporal的信息

Deferred Shading 延迟渲染管线

第一次只更新depth buffer,而不渲染
第二次才真正渲染

从所有光源shading->可见的光源的shading

Tiled Shading

rtrt6.png
利用光源的作用范围有限

Glustered Shading

更进一步的tiled shading,将小条再切成小块

Level of Detail Solutions

也称cascaded,经常用于cascaded shadow map、cascaded LPV、geometric LoD(Nanite in UE5)

Global Illumination Solutions

软光栅光线追踪高分辨率SDF、低分辨率SDF、RSM、Probes
硬件光栅:在简化场景中使用RTRT

Lumen in UE5就是以上SDF、RSM、简化场景硬件RTRT的结合

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2022 d1gg12
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信