【GAMES104】游戏引擎中的渲染实践

目录

    • 1.游戏渲染基础
      • 渲染系统的对象
      • 了解GPU
      • 可渲染物体
      • 可见性裁剪
      • 贴图压缩
      • 建模工具
      • 新的模型管线
      • pilot小引擎
    • 2.材质、shader和光照
      • starting from simple
      • Blinn-Phong模型
      • 阴影贴图
      • 预处理全局光照(烘焙)
        • 光照贴图Light Map
        • 光采样Light Probe
      • 基于物理的材质
      • IBL基于图像的光照
      • 具有层次的Cascade shadow
      • shader管理
    • 3.特殊渲染
      • 3.1 地形
        • 地形的几何
        • 地形的材质
          • 虚拟纹理Virtual Texture
        • 道路植被贴花等
      • 3.2 大气
        • 大气散射理论
          • 两个重要概念
          • 散射类型
        • 实时大气渲染
        • 云的渲染
          • 两个著名噪声方程
          • 用Ray Marching渲染体积云
    • 4.管线pipeline
      • 环境光遮蔽(AO)
      • 雾效(fog)
      • 抗锯齿(anti-aliasing)
      • 后处理
        • 光晕(Bloom)
        • Tone Mapping
        • 调色(Color Grading)
      • 渲染管线
      • Frame Graph
      • V-Sync&G-Sync

写在开头:此篇是对GAMES104第四节到第七节的学习笔记,也就是游戏引擎渲染相关。感谢王希老师以及课程团队的用心付出。
课程相关链接

现代游戏引擎渲染需要深入硬件适配。渲染效率和硬件息息相关,如果想要了解渲染,首选需要学习硬件知识,包括CPU、GPU中的渲染原理。

游戏逻辑、网络、动画、物理以及AI系统会占用CPU和内存的主要计算量

1.游戏渲染基础

渲染系统的对象

详见GAMES101

几何阶段->光栅化阶段->shading

纹理贴图

【GAMES104】游戏引擎中的渲染实践_第1张图片

了解GPU

释放CPU,专用于渲染图像的硬件

GPU使用SIMT机制

【GAMES104】游戏引擎中的渲染实践_第2张图片

现代GPU架构:

【GAMES104】游戏引擎中的渲染实践_第3张图片

一块显卡上有很多组GPC(图形处理集群),一块GPC里有很多core(核心)用于运算,可以并行处理工作且可以互相交换数据。

【GAMES104】游戏引擎中的渲染实践_第4张图片

一定要利用好缓存,这是决定运算速度的关键。因此最好把运算需要的数据都放在缓存中,以减少调用时间。

Bound:流水线中的堵塞,木桶效应中的短板,决定流水线的最终速度

【GAMES104】游戏引擎中的渲染实践_第5张图片

可渲染物体

Game Object是游戏世界里的所有事物,但不是所有GO都是可绘制的。可绘制的前提是具有网格体mesh

现代图形学渲染中,会将所有顶点存在一起(Vertex Data),而三角数据中不会再存一遍,而是用索引代替(Index Data)。理论上节约了6倍的计算存储量。

【GAMES104】游戏引擎中的渲染实践_第6张图片

为什么每个顶点都要单独定义一个法线(Vertex Normal),而不是三角面?因为当出现两个面边缘重合时,点也会有重合,此时如果只有面法线,就将无法渲染出硬边缘

【GAMES104】游戏引擎中的渲染实践_第7张图片

多种材质模型:经典的phong模型、基于物理的PBR模型、表面模型

很多时候,纹理决定材质的表达效果,而非材质参数。

【GAMES104】游戏引擎中的渲染实践_第8张图片

渲染时,会将一个mesh按照组件切分成很多个submesh(虚幻里叫section),然后贴不同纹理。

当同时具有多个类似mesh时,shader也会类似,为了节约存储空间,现代游戏引擎通常会建立资源库用于存储,将mesh、shader、texture分开存放在单独的资源池,方便资源复用。

【GAMES104】游戏引擎中的渲染实践_第9张图片

据此可以引用实例(Instance)概念。一次mesh、shader、texture组成为一个实例。

【GAMES104】游戏引擎中的渲染实践_第10张图片

材质的渲染流程:

Initialize Resource Pools
Load Resources

Sort all Submeshes by Materials

for each Materials
	Updata Parameters
	Updata Textures
	Updata Shader
	Updata VertexBuffer
	Updata IndexBuffer
	for each Submeshes
		Draw Primitive
	end
end

Batch render:大量花草树木等重复性物体渲染时采用,一个实例渲染出几百个物体。

可见性裁剪

包围盒类型:

【GAMES104】游戏引擎中的渲染实践_第11张图片

包围盒是很多计算的基础,尤其是对空间中的物体进行区域划分的基础

BVH:常用分类算法,按照空间距离进行物体划分

【GAMES104】游戏引擎中的渲染实践_第12张图片

由于游戏中很多物体会不断运动,位置变化时分类树也会不断变化,会占用计算量。

其实现代显卡运算很快,所以渲染资源调度相关的算法不再常用了。通过显卡计算,会以尽可能快的速度生成深度图,过滤掉不可见物体的渲染。

【GAMES104】游戏引擎中的渲染实践_第13张图片

贴图压缩

Block Compression,常用压缩算法

【GAMES104】游戏引擎中的渲染实践_第14张图片

在PC端,BC7 or DXTC

在移动端,ASTC or ETC/PVRTC

建模工具

Zbrush——雕刻

blender——建模

Houdini/Unreal——程序化建模

三维扫描重建建模

新的模型管线

Cluster-Based Mesh Pipeline:多个mesh面片相似性高时,构建集群。也是目前主流思想

【GAMES104】游戏引擎中的渲染实践_第15张图片

将一个物体拆分成多个面片,只渲染相机可视区域内的面片

【GAMES104】游戏引擎中的渲染实践_第16张图片

【GAMES104】游戏引擎中的渲染实践_第17张图片

最前沿技术:虚幻的Nanite

总结:

  1. 游戏引擎渲染深度依赖于硬件
  2. 一个模型有多种材质时将模型拆分为submesh
  3. 尽量使用筛除算法来绘制物体,而不是全部绘制
  4. 随着GPU发展,越来越多的工作被转移到GPU上

pilot小引擎

https://github.com/BoomingTech/Pilot

2.材质、shader和光照

渲染反射公式:

【GAMES104】游戏引擎中的渲染实践_第18张图片

辐射度量学

starting from simple

使用简单光源作为主光源

【GAMES104】游戏引擎中的渲染实践_第19张图片

Blinn-Phong模型

比较经典简单的模型,使用朴素的光合叠加原理。

【GAMES104】游戏引擎中的渲染实践_第20张图片

有两个主要缺陷:

  1. 没有能量衰减(实际光在不断反射时强度会减弱,phong里光强守恒)
  2. 材质不逼真(像塑料)

阴影贴图

【GAMES104】游戏引擎中的渲染实践_第21张图片

问题:精度被贴图限制

【GAMES104】游戏引擎中的渲染实践_第22张图片

预处理全局光照(烘焙)

GI: Globe Illimitation(全局光照)

没有全局光和有全局光

【GAMES104】游戏引擎中的渲染实践_第23张图片

球谐函数,越高阶越能应付复杂环境的光照阴影,且效果自然

【GAMES104】游戏引擎中的渲染实践_第24张图片

【GAMES104】游戏引擎中的渲染实践_第25张图片

harmonic函数永远光滑

image-20220411204435571

此处有遗漏,课后补(约50:00开始)

光照贴图Light Map

简化几何体,更少的网格,减少消耗

烘焙时间长,只能处理静态光源(常规情况下),占用内存和GPU,但是减少实时渲染消耗,成本低

本质是空间换时间

光采样Light Probe

反射Probe,采样精度高,密度低,从LP中单独提取出来单独处理的效果

效果没有光照贴图好,但是更灵活

优点:

  • 运行效率高
  • 能同时处理静态和动态物体
  • 同时具有漫反射和镜面反射

缺点:

  • 一部分SH光采样需要预处理
  • 全局光照细节不好,比如重叠建筑的软阴影

【GAMES104】游戏引擎中的渲染实践_第26张图片

基于物理的材质

微表面:反射强度与表面光滑度相关

【GAMES104】游戏引擎中的渲染实践_第27张图片

双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)是用来定义给定入射方向上的辐射照度如何影响给定出射方向上的辐射率。更笼统地说,它描述了入射光线经过某个表面反射后如何在各个出射方向上分布这可以是从理想镜面反射到漫反射、各向同性或者各向异性的各种反射。

BRDF材质主要分为两部分,一是漫反射,一部分是镜面反射

【GAMES104】游戏引擎中的渲染实践_第28张图片

DFG: D(Normal Distribution Function,法向分布函数),F(菲涅尔),G(Geometric attenuatin term,几何衰减)

法向分布常用模型——GGX:高光更集中

【GAMES104】游戏引擎中的渲染实践_第29张图片

菲涅尔:倒影效果

此处需扩展了解,详见GAMES101

几何衰减

【GAMES104】游戏引擎中的渲染实践_第30张图片

迪士尼的BRDF信条:

  1. 多用直觉,少用物理参数
  2. 尽可能少的参数
  3. 参数范围尽量在0到1之间
  4. 在合理的情况下应允许参数超出合理范围
  5. 参数的所有组合都应尽可能地健壮和合理

【GAMES104】游戏引擎中的渲染实践_第31张图片

【GAMES104】游戏引擎中的渲染实践_第32张图片

MR模型更加符合直觉,更不容易出错

【GAMES104】游戏引擎中的渲染实践_第33张图片

IBL基于图像的光照

核心想法:对真实环境的光照预处理,然后进行卷积运算

【GAMES104】游戏引擎中的渲染实践_第34张图片

具有层次的Cascade shadow

【GAMES104】游戏引擎中的渲染实践_第35张图片

按近密远疏的原则

【GAMES104】游戏引擎中的渲染实践_第36张图片

shader管理

Uber shader and Variants:将多种基本shader写成宏

3.特殊渲染

3.1 地形

地形的几何

高度图height map

【GAMES104】游戏引擎中的渲染实践_第37张图片

tessellation——细分三角网格化

只细分fovy视角里的网格,fovy越窄,三角网格越密

细分的核心思想:从等腰直角三角形中间切一刀

【GAMES104】游戏引擎中的渲染实践_第38张图片

如今常用四叉树来作为地形的表达

【GAMES104】游戏引擎中的渲染实践_第39张图片

使用stitching(吸附点)解决不同细分次数的网格块之间连接带来的裂缝问题(T-Junctions),这样的好处是可以减少拓扑结构的改动。吸附完之后会出现面积为0的三角形,可赋值也可不赋值。

【GAMES104】游戏引擎中的渲染实践_第40张图片

TIN:全局使用大小不规则三角形,好处是使用的面少、渲染时间短,坏处是需要长时间预处理、采样率低(少部分特殊 游戏使用)

地形实时改动:如雪地、泥地等

地形体素化

【GAMES104】游戏引擎中的渲染实践_第41张图片

使用如同2D像素一样的点云来作为3D地形,可以根据权重分布随意改动地形地貌而不用计算拓扑结构。经典算法:Marching Cubes

【GAMES104】游戏引擎中的渲染实践_第42张图片

地形的材质

混合贴图

【GAMES104】游戏引擎中的渲染实践_第43张图片

为了使过渡更符合实际,如草地和石头的混合,需要赋予材质贴图高度属性,更高的贴图处于上方。同时,又为了使过渡不太突兀,可加入少许高度混合,即两个贴图的高度差在一定区间内时,使用插值混合过渡。

Texture Array

现代渲染地形通常具有上百种材质贴图,将其排列成一个队列,赋予每个材质默认权重

【GAMES104】游戏引擎中的渲染实践_第44张图片

材质贴图的迭代

【GAMES104】游戏引擎中的渲染实践_第45张图片

虚拟纹理Virtual Texture

好处:极大地减少了显存空间占用

  • 创建一个虚拟索引纹理来表示整个场景的所有混合地形材质
  • 仅基于视图依赖LOD来加载tiles的材质数据
  • 预烘焙材质混合到tile中,并将其存储到物理纹理中

【GAMES104】游戏引擎中的渲染实践_第46张图片

DirectStorage & DMA

基于GPU的新型存储解压读取方式,不再由CPU过手

相机相对性渲染

以相机作为参考系,解决距离过远时出现物体的浮点数精度抖动

道路植被贴花等

道路系统:常见做法为样条

3.2 大气

大气散射理论

本质:光通过介质(气溶胶)发生散射

Radiative Transfer Equation(RTE):辐射传输方程,描述了辐射传输强度L(r→,s^,t)的变化,是参与介质中辐射传播的控制方程。

Volume Rendering Equation(VRE):用于描述光线在物体表面或介质中的传播,其中点的平衡辐射量等于发射辐射量与反射辐射量之和。

两个重要概念
  • Transmittance:透射率,指入射光通过介质的比例,也是入射功率与结果功率之比。

  • Scattering:散射度,指光束通过不均匀介质时,粒子被迫偏离直线轨迹的过程。也包括反射辐射的偏差。

散射类型
  • Rayleigh Scattering(瑞利散射):越短的波长(蓝紫)散射越强,越长的波长散射越弱。

  • Mie Scattering(米氏散射):直径相似或大于入射光波长的粒子对光的散射(如:气溶胶)

【GAMES104】游戏引擎中的渲染实践_第47张图片

单次散射和多次散射

【GAMES104】游戏引擎中的渲染实践_第48张图片

A:如何解决多次散射需要大量计算的问题?

Q:使用Ray Marching算法。

Ray Marching(光线行进):通过迭代地遍历光线,从摄像机向屏幕上的每一个像素发射一条光线,光线按照一定步长前进,检测当前光线距离物体表面的距离,并且根据这个距离调整光线的步长,直到抵达物体表面。

核心思想:沿着射线积分

参考链接和代码:RayMarching入门 - 知乎 (zhihu.com)

实时大气渲染

用空间换时间,提前计算大气散射并存表

【GAMES104】游戏引擎中的渲染实践_第49张图片

三个重要参数: 太阳到天顶的角度 ϕ \phi ϕ,视线到天顶的角度 θ \theta θ,视线和太阳的夹角度 η \eta η

只需要记录这三个角度就能获得从摄像头到天空各个像素的采样

【GAMES104】游戏引擎中的渲染实践_第50张图片

单次散射结果和通透率结合就能获得二次散射,继续结合就能获得多次散射。

缺陷:提前计算消耗大;环境的动态调整;实时渲染消耗。

新型方法:A scalable and Production Ready Sky and Atmosphere Rendering Technique

UE4新版大气实时渲染-论文导读 - 知乎 (zhihu.com)

云的渲染

两个著名噪声方程

Perlin noise(柏林噪声)

Worley noise(细胞噪声)

【GAMES104】游戏引擎中的渲染实践_第51张图片

用Ray Marching渲染体积云

【GAMES104】游戏引擎中的渲染实践_第52张图片

4.管线pipeline

环境光遮蔽(AO)

SSAO:最古老的一个方程,围绕在视野内的每一个像素点生成球体空间内的N个随机采样点。此方法问题较多,对大部分平面来说有近乎一半的采样点在平面以下,是无效采样。

【GAMES104】游戏引擎中的渲染实践_第53张图片

SSAO+:基于SSAO的改进,对于平面来说只需要采半球面即可,解决了冗余采样的问题。但是这个方法仍有问题, 无法区分远近,距离视线很远的地方也会出现很强的AO效果。

【GAMES104】游戏引擎中的渲染实践_第54张图片

HBAO:加入了一个名为attenuation的函数,判断远处物体是否被遮挡,若被遮挡,则视为不影响AO。

【GAMES104】游戏引擎中的渲染实践_第55张图片

GTAO:考虑不同角度的光对环境的影响不同,赋予不同权重,去除attenuation函数,加入了一个多重反射的快速近似值。从数学上彻底解决掉之前的失真问题,让AO效果从一个简单的黑白分明变成了有彩色有色相的效果。

image-20230318135647800

【GAMES104】游戏引擎中的渲染实践_第56张图片

Ray-Tracing AO(RTX):目前的AO前沿方向

雾效(fog)

(经典方法)depth fog:有三种模式:线性、指数型、二阶指数型

【GAMES104】游戏引擎中的渲染实践_第57张图片

(经典方法)height fog:在低于某个高度时,将高度以下的fog全部视为该高度fog值;高于某个高度时,fog强度指数递减。

【GAMES104】游戏引擎中的渲染实践_第58张图片

(新型方法)基于体素化的雾:和前一节的大气原理相似

【GAMES104】游戏引擎中的渲染实践_第59张图片

抗锯齿(anti-aliasing)

锯齿出现原因:真实环境无限的高频率信号 vs 屏幕有限分辨率的不充分采样

解决该方法的核心思想:对像素多次采样,模糊边界

【GAMES104】游戏引擎中的渲染实践_第60张图片

(经典技术)SSAA&MSAA

超采样:对每个像素四倍采样;

多重采样:仍是四倍采样,但仅对边界的点多shading一次。

【GAMES104】游戏引擎中的渲染实践_第61张图片

(新型技术)FXAA:使用卷积边缘检测

【GAMES104】游戏引擎中的渲染实践_第62张图片

【GAMES104】游戏引擎中的渲染实践_第63张图片

(新型技术)TAA:对视频相邻帧进行信号加权平均,减少抖动

【GAMES104】游戏引擎中的渲染实践_第64张图片

后处理

相当于美颜滤镜

光晕(Bloom)

二值化提取出高亮部分之后进行高斯模糊

【GAMES104】游戏引擎中的渲染实践_第65张图片

Tone Mapping

用于解决图像亮部过亮,暗部过暗的问题,让色彩更加均衡,尽可能复原原始场景效果。

通过一条曲线修正曝光,如filmic s-curve和ACES。

【GAMES104】游戏引擎中的渲染实践_第66张图片

调色(Color Grading)

Lookup table(LUT):一个预定的数字数字,用于为特定计算提供快捷方式,将颜色输入值(相机)转换为所需的输出值(最终镜头)。

【GAMES104】游戏引擎中的渲染实践_第67张图片

渲染管线

核心公式:【GAMES104】游戏引擎中的渲染实践_第68张图片

【GAMES104】游戏引擎中的渲染实践_第69张图片

延迟渲染:将Albedo、材质、法线、深度等信息全部整合到G-Buffer里,最后渲染的时候只需要计算光的部分。

【GAMES104】游戏引擎中的渲染实践_第70张图片

Tile-based Rendering:将画面拆成小块,减少读写大型buffer的压力

【GAMES104】游戏引擎中的渲染实践_第71张图片

cluster-based Rendering:将空间切割成多个区域

Visibility Buffer:存储几何信息

虚幻引擎渲染管线:

【GAMES104】游戏引擎中的渲染实践_第72张图片

Frame Graph

渲染管线四大挑战:

  • 复杂并行的工作需要带有复杂资源依赖的同步
  • 大量存储资源是短期临时存在,如果不及时释放会造成内存空间浪费
  • 对资源状态的管理十分复杂,各种内存资源是否需要加锁、什么时候加锁都需管理
  • 在没有大量用户低级知识的情况下利用新公开的GPU功能

使用图形化语言——Frame Graph进行渲染管线管理(感觉就是思维导图)

V-Sync&G-Sync

渲染的最后一步,将画面放到屏幕上,需要解决屏幕刷新和渲染帧率的同步问题。

V-Sync是一种软件设置,可以在游戏中访问,而G-Sync则是内置在显示器中的独立技术。G-Sync基于自适应同步技术,它使用这个系统来调整显示器的刷新率以与GPU的FPS同步。

你可能感兴趣的:(TA,游戏引擎,计算机视觉)