GAMES202 笔记 -Glimpse of Industry Solution

目录

一、Temporal Anti-Aliasing(TAA) 在时间上的抗锯齿或反走样

二、MSAA VS SSAA

基于图像的反走样-SMAA(Enhanced subpixel morphological AA)

三、Temporal Super Resolution

DLSS 1.0:通过猜测来提供额外信息的

DLSS 2.0:利用temporal的信息

四、Deferred Shading(延迟渲染)

Tiled Shading

Clustered Shading

五、Level of Detail Solutions-细节分级

cascaded-工业界LOD

Cascaded shadow maps

Cascaded LPV-全局光照方法

other-UE5

 六、Global Illumination Solutions

工业界hybrid solutions


一、Temporal Anti-Aliasing(TAA) 在时间上的抗锯齿或反走样

  • why aliasing?
    • Not enought samples per pixel during rasterization 一个像素中的样本数量不足
    • Therefore, the ultimate solution is to use more samples 终极解决方案就是用更多的样本,也就是101中的MSAA

TAA:当前帧会复用上一帧的sample,使得这一帧仍然用1SPP,但是无形中通过temporal的reuse,增加了SPP。

把样本分布到过去的N帧中去,然后每一帧从过去的N帧中取得样本信息然后Filter,达到N倍Super Sampling的效果。通过将前N帧内的样本点的结果平均起来,其效果与在当前帧内增加样本点的效果一样。

不随机采样点是因为随机的效果不一定好,因为在temporal中可能会引入额外的高频的信息,因此使用规定好的样本点,如上图每四帧一个,这样固定样本点位置避免了分布不均匀的情况。

  • 在静止情况下我们是在一个像素里找sample的结果并复用上一帧中的样本点的结果
  • 在运动场景中,当前帧几何的位置通过motion vector找到上一帧中对应的位置,并复用其结果,如果temporal的信息不太可信时,使用clamping方法,也就是把上一帧的结果拉到接近当前帧的结果。

二、MSAA VS SSAA

SSAA可以看作是将一个场景按照几倍的分辨率先渲染后再降采样,把几个像素的结果平均起来,开销比较大。对每个采样点都要着色。

MSAA:对于同一个primitive(几何体)中,每个样本只做一次shading,如图,有四个sample,两个primitive。只做两次shading,第一次在三角形中的1号样本做shading,第二次在0,3,2号样本点找一个平均位置做shading。如果使用SSAA的话,此处需要做4次shading,所以MSAA提升了效率。

MSAA允许进行sample reuse,这个不是时间上的reuse而是空间上的。在1和2两个像素内,在两个像素的连接处有两个采样点,这两个采样点既可以贡献给像素1也可以贡献给像素2,因此实际上等于通过reuse在6个采样点的情况下得到了8个采样点的结果,减少了采样点的数量,提升了效率。

基于图像的反走样-SMAA(Enhanced subpixel morphological AA)

先渲染出有锯齿的图然后通过图像处理的方法将锯齿给提取出来并替换成没有锯齿的图

G-buffers是绝对绝对不能反走样的!!!

三、Temporal Super Resolution

 低分辨率变成高分辨率,DLSS就是这么一种技术,将一张低分辨率的图输入最后得到一张高分辨率的输出。

DLSS 1.0:通过猜测来提供额外信息的

DLSS 2.0:利用temporal的信息

应用TAA,更多的去结合上一帧的信息运用到当前帧中,仍然是temporal reuse。

问题:

  1. 如果有temporal failure时,我们不可以在使用clamping的方法来解决,也就是对temporal的信息利用要求更加严格。
  2. 因为我们最终要的是一个增大了分辨率的图,分辨率提高也就是像素点增多,那么我们需要知道新增加的小的pixel的像素值是多少,如果此时我们用上一帧的结果盲目的clamping势必会因为一些小的像素的值是根据周围的点的颜色猜测出来的,而且猜测的值很像周围的点,也就是我们得到了一个高分辨率的图但是很糊。总结来说由于DLSS真正的提升了分辨率,因此我们要求新产生的像素的值是要与之前有本质的不同的,否则就会得到一个糊掉的结果。

我们需要一个比clamping更好的复用temporal信息的方案。

  1.  左边中的蓝色代表上一帧,绿色代表当前帧,绿点是当前帧给了一个采样信号得到的值,在上一帧也就是蓝色曲线中我们可以从另一个信号采样出来值,最后我们要把二者综合在一起得出一个当前帧增加了采样点后的值。

四、Deferred Shading(延迟渲染)

节省shading时间的方法,是为了让shading变得更高效更快

  • 传统的光栅化过程:
    • Triangles -> fragments -> depth test-> shade ->pixe
    • 这可能会出现每一个fragment都需要shading的情况,比如你需要从远处到近处渲染时,需要将每一个fragment都进行shading
  • 很多fragment在渲染过程中会通过depth test,但最终可能会因为被后续的fragment所覆盖而不会被看到,因此这些在过程中被shading的fragment浪费了很多的资源。
  • 只去渲染可见的fragment

将场景光栅化两次。

  1. 在第一次光栅化中得到fragment之后我们不做shading,所有的fragment只对深度缓存(depth buffer)做一个更新。
  2. 由于在Pass1中我们已经写好了depth buffer并且知道了最前深度,因此在pass2中只有深度等于最浅深度的fragment才可以通过depth test并进行shading,从而实现了只对visible fragment着色。
  3. 由于依赖于depth buffer(属于G-buffer),所以pass1和pass2都无法做anti-aliasing。

Tiled Shading

将屏幕分成若干个小块,比如一个小块是32 * 32,然后对每个小块单独的做shading。

数字代表区域内会影响到它的光源数量。

  1. 可以节省每个小块要考虑的light数量,每个切出来的小块代表场景中3D的区域,并不是所有的光源都会跟这片区域相交。
  2. 光照强度会随着距离的平方衰减,因此面光源或点光源的覆盖范围是很小的,我们根据其随距离平方的减少找出最小值,也就是设定一个范围,光源的覆盖范围看做一个球形。因此我们在渲染时,只需要找会影响到区域的光源即可,不需要考虑所有的光源。

Clustered Shading

不仅将其分成若干个小块,还要在深度对其进行切片,也就是我们将整个3D空间拆分成了若干个网格。

五、Level of Detail Solutions-细节分级

 texture的mip-map就是一个LOD,在high level时detail少一点,但可以很快的计算出一个区域的平均,在任何计算过程中能够快速准确的找出一个正确的level去进行各种运算。

cascaded-工业界LOD

Cascaded shadow maps

从camera出发看向场景,离camera远的我们可以用粗糙的shadow map。通常会生成两种或以上不同分辨率的shadow map进行使用的。根据物体在场景的位置来选用shadow map,远点的就用粗糙的,近处的就用精细的。

红色区域是一个高分辨率的shadow map,蓝色区域是覆盖范围更大但分辨率相同也就是更粗糙的shadow map。

图中可以看到会有重叠区域内,因为在突然切换层级时会有一个突变的artifact,为了有一个平滑的过度,在这个区域内我们通过距离,也就是近处的以蓝色区域的shadow map为主将二者blend起来,从而产生平滑的过度。

Cascaded LPV-全局光照方法

使用3D网格去传播直接光反弹到任何地方的Radiance

先在细小的格子上,之后随着距离的增加到大一点的格子,再远就更大,从而省去了很多的计算量。

other-UE5

  1. 如果有一个精细的有许多三角形的模型(高模),我们可以将其减化,减少其三角形使其变成一个低模,我们可以生成一系列的低模。
  2. 根据物体离camera的距离,来选择放什么层级的模型进去(高模还是低模)并且一个物体的不同部分也可以做不同的LOD,只需要提供一个标准,比如说这个标准是保证任何时候三角形都不会超过一个像素的大小。这样可以保证一个模型可以根据camera在哪,从而动态的告诉渲染管线需要渲染什么层级的模型或者部分。

 六、Global Illumination Solutions

screen space ray tracing (SSR) fail:

  1. 出了屏幕
  2. 反射物在camera背后
  3. 由于是屏幕空间的几何表示,因此只用了depth表示了一层壳,在trace时如果在壳的后面是无法知道的。
  4. 没有任何的GI解决方法可以将所有的情况都给解决掉,除了RTRT(实时光线追踪),因为他理论上一个是一个正确的path tracing,肯定可以解决各种情况。

工业界hybrid solutions

选做一遍SSR,得到一个近似的GI,对于SSR无法得到的结果,专用其他的ray tracing方法。

  • 近处:在任意一个shading point,在他周围的一定范围内的物体我们用一个较高分辨率或称为较高质量的SDF,SDF可以让我们在shader中快速的tracing.
  • 远处:我们则用一个稍低质量的SDF将整个场景覆盖,至此不论近处还是远处我们都可以通过SDF得到最终光照打到的结果。
  • 如果场景中有强烈的方向光源或者点光源,也就是手电筒之类的光源,我们则通过RSM来解决。
  • 如果场景时diffuse的我们则通过DDGI来解决
  • Doesn't have to use the original geometry,but low-poly proxies。没有必要去使用原始geometry,可以用一些简化了的模型去代替原始模型从而加快trace的速度。

© 版权声明
THE END
喜欢就支持一下吧
点赞505 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容