avatar

Ycyofmine’s Blog

云鸮雨霁

  • 首页
  • 分类
  • 标签
  • 归档
  • 关于
首页 GAMES104 07.游戏中渲染管线、后处理和其他的一切
文章

GAMES104 07.游戏中渲染管线、后处理和其他的一切

发表于 2024/10/21
作者 Ycyofmine
7 分钟阅读

Ambient Occulsion

在每个可看见的点处,它的可看见的正半球面,只有部分可以染上环境光,另一部分则被其他物体遮挡,主要体现在阴影的真实程度上。

Precomputer AO

  • 提前烘培出的一张AO纹理
  • 仅适用于静态对象

Screen Space Ambient Occlusion(SSAO)

  1. 从screen打出一条射线,击中一个点p,在那个点生成一个球,球内随机采样多个点。
  2. 从camera中再次向球内采样点射出射线,比较采样点位置和 depth buffer 。
  3. 根据被遮挡和未被遮挡的数量关系估计AO
  4. $A(p) = 1 - \frac{Occulsion}{N}$ 在实际生产环境中,发现这个公式是错误的。后改进为 SSAO+ 。

SSAO+

以点p的法线为中心,构造一个半球,再做 3. 的工作。

Horizon-based Ambient Occlsuion(HBAO)

从某个点发射ray,去找能看到天顶的最大仰角,找一圈后积分就可以得到被遮挡面积。

是的,孩子们,还是我 Ray Marching😎。

Ground Truth-based Ambient Occlusion(GTAO)

使用多项式方程拟合积分方程,算出AO。

Ray-Tracing Ambient Occlusion

从每个像素往外射线

雾效

Depth Fog

随着距离的增加,透明度越来越低。

Height Fog

一定高度下的雾,浓度都是最大值,高度之上按对数的速度递减

Voxel-base Volumetric Fog

  • 把视锥的切面按固定的值均分。
  • 进行 Ray Marching。(还是我😎)

抗锯齿

  • Edge Sampling
  • Texture Sampling
  • Specular Sampling

Super-sample Anti-aliasing(SSAA) and Multi-sample AA(MSAA)

  • SSAA:4倍渲染分辨率、4倍z-buffer、4倍frame-buffer、4倍光栅化,最后再滤波
  • MSAA:4倍z-buffer、4倍frame-buffer、4倍光栅化,最后只对需要的像素计算权重来shading(边缘)

Fast Approximate Anti-aliasing(FFAA)

  1. 先把颜色转换到亮度空间,然后用一个十字形滤波找到边界,对于一个像素点M,找到它上下左右的邻居,求出五个点最大最小值的插值,检查是否超过某个阈值,超过则是边界。

    FFAA-1

  2. 分别对横竖都做一次卷积,检测分界线是横还是竖,然后再判断具体方向。

  3. 找到一个像素对,如 图FFAA-1 中的 MN ,从 M 出发,沿 MN 的垂直方向寻找最近的颜色变化点,作为边的两端。然后比较左右两端的到M这个像素对的长度,根据长度决定如何混合。

Temporal Anti-aliasing(TAA)

当前帧,与前一帧进行混合。

缺点:会有一点错位,没做好会出现残影。

后处理

Bloom Effect

  1. Detect Bright Area by Threshold

    Luminance(Y)

    $Y = R_{lin} * 0.2126 + G_{lin} * 0.7152 + B_{lin} * 0.0722$

  2. Gaussian Blur

    先降采样,然后上一个 Gaussian Blur ,放大后再加回去(有权重)

Tone Mapping

宽容度不够时,我们需要用曲线将画面调回正常。

业内比较知名的两条曲线:Filmic s-curve & ACES

Color Grading

将颜色值作为坐标,在LUT中查询得到新的颜色。

渲染管线

Forward Rendering

  • 按顺序渲染:遍历每一个mesh,遍历每一束光,计算shading

  • Transparent Sorting

    有透明物质的话,先绘制不透明物质,多个透明物质需要由远及近地绘制

Deferred Rendering

  • 先渲染一遍存到 Geomtry Buffer(G-Buffer)
  • 对于每个像素,计算每一个光的效果

优点:方便加点光源,容易debug。 缺点:G-Buffer 会导致频繁内存读,消耗大。

Tile-based Rendering

受限于移动端的硬件,我们将画面分成块,分别进行渲染。

Light Culling by Tiles

每个 tile 拥有⼀个光源列表,在着色时,只对列表里的光源进行计算,就不用对整个场景进行计算。

Depth Range Optimization

按深度分出一个区域,一个光源只照一个范围内的物体

Forward+(Tile - based Forward) Rendering

一个一个Tile来绘制。

Cluster-based Rendering

Visibility Buffer

G-Buffer把所有信息写在了一起,我们现在把几何信息和材质信息剥离开来:某个像素属于某个集合体,然后反向去查材质信息。

在现在几何体远远大于像素量的情况下,这么做效率高很多。

Frame Graph

把引擎里的各个模块通过有向无环图连接在一起,通过系统自动检查模块间的依赖关系、管理内存释放。

核心思想:当一个系统足够复杂时,我们定义一个图形化的语言,把模块之间的依赖关系、前后关系表达出来。才能更好地把系统管理起来。

V-sync & G-sync

Screen Tearing

V-sync

等frame buffer写完以后,等到显示器刷新后一整个显示,不允许写到一半的时候进行刷新。

Variable Refresh Rate

显示器动态帧率。

GAMES104
games104
本文由作者按照 CC BY 4.0 进行授权
分享

最近更新

  • ROS2中并发连接蓝牙手柄排错过程
  • 自行编译ros2-humble-plotjuggler
  • Ubuntu 22.04上蓝牙无法打开——(MT7922网卡为例)
  • Isaac sim遥操作控制
  • RPC:原理、组成与局限性
外部链接
  • codetime
  •  此博客的 Github 仓库

文章内容

相关文章

2024/11/12

GAMES104 09.高级动画技术:动画树、IK和表情动画

动画混合 Math of Blending: LERP Calculate Blend Weight Align Blend Timeline 把两个循环动画时间归一化,要求动画师对齐两组动画中的关键点。 如果align或者插值没做好,容易出现滑步。 混合空间 1D Blend Space 混合方向,但是没有混合运动速度。 2D Blend S...

2024/11/05

GAMES104 08.游戏引擎的动画技术基础(下)

蒙皮动画的实现:关节与蒙皮 Joint Pose Affine Matrix Orientation 大部分骨骼动画是旋转。 Position Pelvis、特殊的机械结构、facial joints会发生位置的变化。 Scale 对面部进行修改。 Loca...

2024/11/01

GAMES104 08.游戏引擎的动画技术基础(上)

靠,被专周硬控一周,不过好在大概知道C++项目整个流程是什么样的了,也算是有所收获。 2D游戏动画技术 Sprite animation 多张图片顺序播放。 Live 2D 将图片拆分成多个图源,在图源上打上控制点,通过移动控制点来达到图片变换的效果。 3D游戏动画技术 DoF(Degrees of Freedom) 六方向自由度代表可以按 xyz 进行平移或旋转。 Rigid Hi...

GAMES104-作业2

C++ Primer(正在更新)

© 2025 Ycyofmine. 保留部分权利。

本站采用 Jekyll 主题 Chirpy

热门标签

games104 UE c++ robot OS 装机 计网 essay

发现新版本的内容。