Lecture07 Rendering Pipeline, Post-Process and Everything

Ambient Occlusion

接触阴影,满足渲染方程,但在渲染过程中直接渲染很难做到,因为计算尺度小(称为中尺度)。

AO:单目视觉中形成3D感的重要元素

L07_AO

不考虑尺度差异,AO和BRDF中的Geometry项(Shadowing-Masking)非常相似。

Precomputed AO

使用Ray Tracing预计算成AO贴图。最为传统,但目前在角色等高精度需求中仍应用广泛。

效果好,计算复杂,且无法处理多物体之间的AO。

SSAO, Screen Space AO

@GAMES202 SSAO

HBAO, Horizon-based Ambient Occlusion
  • 在法线方向半球空间内积分 \[ A=1-\dfrac{1}{2\pi}\int_{\theta=-\pi}^\pi\int_{\alpha=t(\theta)}^h(\theta)W(\vec\omega)\cos\alpha\,\mathrm d\alpha\mathrm d\theta \] L07_HBAO2L07_HBAO1

  • 利用深度图做Ray Marching L07_HBAO3

GTAO, Ground Truth - based AO

SSAO和HBAO假定了各方向射入的光贡献相同,因此物理上错误。(法线方向照射来的光贡献更多。)

  • L07_GTAO \[ \hat A(x)=\dfrac{1}{\pi}\int_0^\pi\int_{\theta_1(\phi)}^{\theta_2(\phi)}\cos(\theta-\gamma)^+|\sin(\theta)|\,\mathrm d\theta\mathrm d\phi\\\gamma={\rm angle}(\vec n, \vec v) \]

  • 根据大量的AO数据,拟合了一个三阶多项式,实现了有颜色的AO

Ray-Tracing AO

@GAMES202 RTRT

Fog

Depth Fog

随着深度透明度下降

  • Linear fog: factor = (end-z) / (end - start)
  • Exp fog: factor = exp(- density * z)
  • Exp Squared fog: factor = exp(- (density * z) ^ 2)

L07_DepthFog

Height Fog

设定某一高度阈值,阈值以下恒定Fog强度,阈值以上指数递减

  • 观察方向的Height Fog积分 \[ \begin{array}{c}D(h)=D_\max\cdot e^{-\sigma\cdot\max(h-H_s, 0)}\\ \begin{aligned}{\rm FogDensityIntegration}=&\ D_\max\cdot d\int_0^1 e^{-\sigma\cdot\max(v_z+t\cdot d_z-H_s, 0)}\,\mathrm dt\\=&\ D_\max\cdot de^{-\sigma\cdot\max(v_z-H_s, 0)}\dfrac{1-e^{-\sigma\cdot d_z}}{\sigma\cdot d_z} \end{aligned}\end{array} \] L07_HeightFog

  • Fog颜色 \[ {\rm FogInscatter}=1-\exp^{- \rm FogDensityIntegration}\\ {\rm FinalColor} = {\rm FogColor}\cdot{\rm FogInscatter} \]

Voxel-based Volumetric Fog

现代的雾效,可以实现丁达尔效应

  • 对整个相机空间Voxelize,以不同大小的四棱台作Voxel L07_VoxelFog1
  • 计算方法与Atmosphere计算相似
  • 用一个3D Texture存储,长宽尽量与屏幕成整数倍(eg. 160*90)

Anti-aliasing

@GAMES202 AA

三种走样:Edge Sampling, Texture Sampling(MIPMAP可解决), Specular Sampling

Post-process

Bloom 光晕
  • 检测提取高光区域(计算灰度,比较阈值)
  • 对高光区域作Gaussian Blur(横向/纵向各一轮减少计算) -> Pyramid Gaussian Blur L07_PyramidGuassianBlur
  • 将模糊完的图像叠加到图像上
Tone Mapping

HDR to SDR

  • flimic s-curve L07_Filmic
  • ACES
Color Grading
  • LUT

Tone Mapping and Color Grading is my area hhhhh (at DFTT of BFA)

Rendering Pipeline

Forward Rendering
  • Shadow Pass -> Shading -> Post-process
  • 逐物体绘制
  • 透明材质排序,由远及近绘制 -> 各种问题
  • 多光源绘制复杂
Deferred Rendering
  • Pass 1

    for each object:
      write G-Buffer;
  • Pass 2

    for each pixel:
      gbuffer = readGBuffer(G-Buffer);
      for each light:
          computeShading(gbuffer, light);
Tiled-based Rendering
  • 移动端读写能耗大

  • 切成小块,小块渲染、小块读写

  • 光源也可以被切割成Tile

  • 深度上也可对光源优化

  • Tiled Deferred Rendering
  • Forward+ (Tiled Forward) Rendering
Cluster-based Rendering

L07_ClusterBasedRendering

Visibility Buffer
  • V-Buffer
    • Depth
    • PrimitiveID
    • Barycentrics
  • L07_VisibilityBuffer

Unreal Engine Rendering Pipeline L07_UnrealRenderingPipeline

V-Sync / FreeSync / VRR