写在开头:此篇是对GAMES104第四节到第七节的学习笔记,也就是游戏引擎渲染相关。感谢王希老师以及课程团队的用心付出。
课程相关链接
现代游戏引擎渲染需要深入硬件适配。渲染效率和硬件息息相关,如果想要了解渲染,首选需要学习硬件知识,包括CPU、GPU中的渲染原理。
游戏逻辑、网络、动画、物理以及AI系统会占用CPU和内存的主要计算量
详见GAMES101
几何阶段->光栅化阶段->shading
纹理贴图
释放CPU,专用于渲染图像的硬件
GPU使用SIMT机制
现代GPU架构:
一块显卡上有很多组GPC(图形处理集群),一块GPC里有很多core(核心)用于运算,可以并行处理工作且可以互相交换数据。
一定要利用好缓存,这是决定运算速度的关键。因此最好把运算需要的数据都放在缓存中,以减少调用时间。
Bound:流水线中的堵塞,木桶效应中的短板,决定流水线的最终速度
Game Object是游戏世界里的所有事物,但不是所有GO都是可绘制的。可绘制的前提是具有网格体mesh
现代图形学渲染中,会将所有顶点存在一起(Vertex Data),而三角数据中不会再存一遍,而是用索引代替(Index Data)。理论上节约了6倍的计算存储量。
为什么每个顶点都要单独定义一个法线(Vertex Normal),而不是三角面?因为当出现两个面边缘重合时,点也会有重合,此时如果只有面法线,就将无法渲染出硬边缘。
多种材质模型:经典的phong模型、基于物理的PBR模型、表面模型
很多时候,纹理决定材质的表达效果,而非材质参数。
渲染时,会将一个mesh按照组件切分成很多个submesh(虚幻里叫section),然后贴不同纹理。
当同时具有多个类似mesh时,shader也会类似,为了节约存储空间,现代游戏引擎通常会建立资源库用于存储,将mesh、shader、texture分开存放在单独的资源池,方便资源复用。
据此可以引用实例(Instance)概念。一次mesh、shader、texture组成为一个实例。
材质的渲染流程:
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:大量花草树木等重复性物体渲染时采用,一个实例渲染出几百个物体。
包围盒类型:
包围盒是很多计算的基础,尤其是对空间中的物体进行区域划分的基础
BVH:常用分类算法,按照空间距离进行物体划分
由于游戏中很多物体会不断运动,位置变化时分类树也会不断变化,会占用计算量。
其实现代显卡运算很快,所以渲染资源调度相关的算法不再常用了。通过显卡计算,会以尽可能快的速度生成深度图,过滤掉不可见物体的渲染。
Block Compression,常用压缩算法
在PC端,BC7 or DXTC
在移动端,ASTC or ETC/PVRTC
Zbrush——雕刻
blender——建模
Houdini/Unreal——程序化建模
三维扫描重建建模
Cluster-Based Mesh Pipeline:多个mesh面片相似性高时,构建集群。也是目前主流思想
将一个物体拆分成多个面片,只渲染相机可视区域内的面片
最前沿技术:虚幻的Nanite
总结:
https://github.com/BoomingTech/Pilot
渲染反射公式:
辐射度量学
使用简单光源作为主光源
比较经典简单的模型,使用朴素的光合叠加原理。
有两个主要缺陷:
问题:精度被贴图限制
GI: Globe Illimitation(全局光照)
没有全局光和有全局光
球谐函数,越高阶越能应付复杂环境的光照阴影,且效果自然
harmonic函数永远光滑
此处有遗漏,课后补(约50:00开始)
简化几何体,更少的网格,减少消耗
烘焙时间长,只能处理静态光源(常规情况下),占用内存和GPU,但是减少实时渲染消耗,成本低
本质是空间换时间
反射Probe,采样精度高,密度低,从LP中单独提取出来单独处理的效果
效果没有光照贴图好,但是更灵活
优点:
缺点:
微表面:反射强度与表面光滑度相关
双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)是用来定义给定入射方向上的辐射照度如何影响给定出射方向上的辐射率。更笼统地说,它描述了入射光线经过某个表面反射后如何在各个出射方向上分布这可以是从理想镜面反射到漫反射、各向同性或者各向异性的各种反射。
BRDF材质主要分为两部分,一是漫反射,一部分是镜面反射
DFG: D(Normal Distribution Function,法向分布函数),F(菲涅尔),G(Geometric attenuatin term,几何衰减)
法向分布常用模型——GGX:高光更集中
菲涅尔:倒影效果
此处需扩展了解,详见GAMES101
几何衰减
迪士尼的BRDF信条:
MR模型更加符合直觉,更不容易出错
核心想法:对真实环境的光照预处理,然后进行卷积运算
按近密远疏的原则
Uber shader and Variants:将多种基本shader写成宏
高度图height map
tessellation——细分三角网格化
只细分fovy视角里的网格,fovy越窄,三角网格越密
细分的核心思想:从等腰直角三角形中间切一刀
如今常用四叉树来作为地形的表达
使用stitching(吸附点)解决不同细分次数的网格块之间连接带来的裂缝问题(T-Junctions),这样的好处是可以减少拓扑结构的改动。吸附完之后会出现面积为0的三角形,可赋值也可不赋值。
TIN:全局使用大小不规则三角形,好处是使用的面少、渲染时间短,坏处是需要长时间预处理、采样率低(少部分特殊 游戏使用)
地形实时改动:如雪地、泥地等
地形体素化:
使用如同2D像素一样的点云来作为3D地形,可以根据权重分布随意改动地形地貌而不用计算拓扑结构。经典算法:Marching Cubes
混合贴图
为了使过渡更符合实际,如草地和石头的混合,需要赋予材质贴图高度属性,更高的贴图处于上方。同时,又为了使过渡不太突兀,可加入少许高度混合,即两个贴图的高度差在一定区间内时,使用插值混合过渡。
Texture Array
现代渲染地形通常具有上百种材质贴图,将其排列成一个队列,赋予每个材质默认权重
材质贴图的迭代
好处:极大地减少了显存空间占用
DirectStorage & DMA
基于GPU的新型存储解压读取方式,不再由CPU过手
相机相对性渲染
以相机作为参考系,解决距离过远时出现物体的浮点数精度抖动
道路系统:常见做法为样条
本质:光通过介质(气溶胶)发生散射
Radiative Transfer Equation(RTE):辐射传输方程,描述了辐射传输强度L(r→,s^,t)的变化,是参与介质中辐射传播的控制方程。
Volume Rendering Equation(VRE):用于描述光线在物体表面或介质中的传播,其中点的平衡辐射量等于发射辐射量与反射辐射量之和。
Transmittance:透射率,指入射光通过介质的比例,也是入射功率与结果功率之比。
Scattering:散射度,指光束通过不均匀介质时,粒子被迫偏离直线轨迹的过程。也包括反射辐射的偏差。
Rayleigh Scattering(瑞利散射):越短的波长(蓝紫)散射越强,越长的波长散射越弱。
Mie Scattering(米氏散射):直径相似或大于入射光波长的粒子对光的散射(如:气溶胶)
单次散射和多次散射
A:如何解决多次散射需要大量计算的问题?
Q:使用Ray Marching算法。
Ray Marching(光线行进):通过迭代地遍历光线,从摄像机向屏幕上的每一个像素发射一条光线,光线按照一定步长前进,检测当前光线距离物体表面的距离,并且根据这个距离调整光线的步长,直到抵达物体表面。
核心思想:沿着射线积分
参考链接和代码:RayMarching入门 - 知乎 (zhihu.com)
用空间换时间,提前计算大气散射并存表
三个重要参数: 太阳到天顶的角度 ϕ \phi ϕ,视线到天顶的角度 θ \theta θ,视线和太阳的夹角度 η \eta η
只需要记录这三个角度就能获得从摄像头到天空各个像素的采样
单次散射结果和通透率结合就能获得二次散射,继续结合就能获得多次散射。
缺陷:提前计算消耗大;环境的动态调整;实时渲染消耗。
新型方法:A scalable and Production Ready Sky and Atmosphere Rendering Technique
UE4新版大气实时渲染-论文导读 - 知乎 (zhihu.com)
Perlin noise(柏林噪声)
Worley noise(细胞噪声)
SSAO:最古老的一个方程,围绕在视野内的每一个像素点生成球体空间内的N个随机采样点。此方法问题较多,对大部分平面来说有近乎一半的采样点在平面以下,是无效采样。
SSAO+:基于SSAO的改进,对于平面来说只需要采半球面即可,解决了冗余采样的问题。但是这个方法仍有问题, 无法区分远近,距离视线很远的地方也会出现很强的AO效果。
HBAO:加入了一个名为attenuation的函数,判断远处物体是否被遮挡,若被遮挡,则视为不影响AO。
GTAO:考虑不同角度的光对环境的影响不同,赋予不同权重,去除attenuation函数,加入了一个多重反射的快速近似值。从数学上彻底解决掉之前的失真问题,让AO效果从一个简单的黑白分明变成了有彩色有色相的效果。
Ray-Tracing AO(RTX):目前的AO前沿方向
(经典方法)depth fog:有三种模式:线性、指数型、二阶指数型
(经典方法)height fog:在低于某个高度时,将高度以下的fog全部视为该高度fog值;高于某个高度时,fog强度指数递减。
(新型方法)基于体素化的雾:和前一节的大气原理相似
锯齿出现原因:真实环境无限的高频率信号 vs 屏幕有限分辨率的不充分采样
解决该方法的核心思想:对像素多次采样,模糊边界
(经典技术)SSAA&MSAA
超采样:对每个像素四倍采样;
多重采样:仍是四倍采样,但仅对边界的点多shading一次。
(新型技术)FXAA:使用卷积边缘检测
(新型技术)TAA:对视频相邻帧进行信号加权平均,减少抖动
相当于美颜滤镜
二值化提取出高亮部分之后进行高斯模糊
用于解决图像亮部过亮,暗部过暗的问题,让色彩更加均衡,尽可能复原原始场景效果。
通过一条曲线修正曝光,如filmic s-curve和ACES。
Lookup table(LUT):一个预定的数字数字,用于为特定计算提供快捷方式,将颜色输入值(相机)转换为所需的输出值(最终镜头)。
延迟渲染:将Albedo、材质、法线、深度等信息全部整合到G-Buffer里,最后渲染的时候只需要计算光的部分。
Tile-based Rendering:将画面拆成小块,减少读写大型buffer的压力
cluster-based Rendering:将空间切割成多个区域
Visibility Buffer:存储几何信息
虚幻引擎渲染管线:
渲染管线四大挑战:
使用图形化语言——Frame Graph进行渲染管线管理(感觉就是思维导图)
渲染的最后一步,将画面放到屏幕上,需要解决屏幕刷新和渲染帧率的同步问题。
V-Sync是一种软件设置,可以在游戏中访问,而G-Sync则是内置在显示器中的独立技术。G-Sync基于自适应同步技术,它使用这个系统来调整显示器的刷新率以与GPU的FPS同步。