简化的架构


  • Tool Layer:面向用户,DCC和引擎交互
  • Function Layer:tick,渲染+逻辑,etc…
  • Resource Layer:资源格式转换为资产(更高效的内部数据),GUID资产识别,资产生命周期管理(核心)
  • Core Layer:数学库,更高效的数据结构、容器,内存管理
  • Platform Layer:RHI(封装不同的图形API,向上提供统一接口)

Function 和 Core 可能有很多交汇

Game World


各种光源、人物角色、像机乃至空气墙、触发器都可以表示成对象Object

各种过于复杂的关系导致继承系统很难表示,引入组件components,可以看一下ECS模式

component-based Tick,相同组件同时tick,更加高效

事件系统,消息机制类似进程信箱通信,需要可扩展消息以支持物体间各种交互事件

场景管理,八叉树、BVH(bounding box)等等

pretick & posttick,多线程下统一时序

引擎中的渲染


可结合games101

一些挑战

  • 场景中的大量物体需要渲染
  • 复杂的底层硬件适配
  • 稳定的帧率
  • 有限的资源分配

GPU,SIMT结构,GPU架构

mash - submash - shader,可以按照材质排序渲染,实例Instance概念(定义和渲染概念分离)

可见性裁剪,包围盒+场景划分(BVH)

纹理压缩,常用压缩算法无法随机访问位置,使用基于Block Compression的常用算法

光、材质和shader


再次参考101

一些挑战

  • BRDF如何快速进行积分
  • 光源本身的复杂性、间接光源的处理
  • shadow!

预计算全局光照(Global IIIumination),球面空间如何采样和积分,球谐函数(Spherical Harmonics)!!!

个人对使用SH函数的理解,不需要采样球上成千上万的点,而且全局光关注的基本是低频信息,直接使用类似傅里叶变换从空域到频域映射加卷积提取其特征即可,球谐基本就是这个作用,可以非常高效的提取亮部和暗部,可以看一下各级球谐函数的图像,阶数越高,能表示的精度越高(亮暗面更多),12个参数(球谐函数4个*RGB3个)即可表示

SH Lightmap:烘培很慢但效果很好,基本适用于静态物体

Light Probe && Reflect Probe:低频采样但是可以实时

PBR:当前常用的有

  • Specular Glossiness(SG模型,RGB+菲涅尔+粗糙度,DFG!),菲涅尔项容易炸

  • Metallic Roughness(RGB+粗糙度+金属度),根据金属度设置菲涅尔项,更强的可控性

IBL:Image-based Lighting,会有多级表示不同的频率

VSSM:利用方差、期望等直接求软阴影


总结-引擎渲染部分实现

全局光照 -> SH lightmap + Probe

材质 -> PBR两大模型 + IBL

阴影 -> VSSM + Cascade

地形、植被(terrain,vegetation)


LOD:level of detail,层次细节

QuadTree-Based Subdivision:四叉树地形管理

地形纹理交界处混合,hack,加bias!

Virtual texture:类似mipmap,混合全部材质,有点像OS里的页面置换,存显存里!

核心思路就是近处细分,远处粗糙

大气sky


首先,看到对的就是对的,拟合大气表现!两个参数:视线和太阳、视线和天顶的角度,但只能有一种表现,没有天气,只能在地面…

进一步,不是真空,光会穿过空中的气溶胶、水汽等等,会发生吸收、散射、气体自发光、来自其他物体的光,积分全是积分!从物体一路积分过来,有多少光能穿过来(通透度)、其他光对这条光路的贡献

再进一步,对瑞利散射的模拟,米氏散射的模拟

具体实现,

基于ray marching,沿着一条光路采样、积分得到结果,可以预渲染precomputed,存到贴图中,得到角度等参数时直接用即可

云cloud


mesh云:加噪声等等

billboard云:二维片模拟

体积云:实时处理,weather texture很有用

噪声立大功

环境光遮蔽AO


几种实现

  • 离线预计算,烘培到贴图
  • SSAO+,但屏幕空间无法处理不同物体距离
  • HBAO,看天顶,多少角度可以越过周围遮挡物,但无法区分不同角度照过来的光
  • GTAO,区分了光的角度,无敌


几种实现

  • 深度雾,通过线性函数
  • height fog,雾会沉在下面,根据高度展示,积分浓度
  • 体素雾,类似云渲染

后处理Post-process


主要应用

  • Bloom效果:泛光,提取亮部再blur,会对结果缩小再放大,为了得到晕开的效果
  • Tone Mapping:色调映射,很多映射曲线,经典filmic curve,目前用的多的是ACES
  • color grading:调色,又叫LUT,也是一个简单的映射

渲染管线pipeline


前向渲染forward rendering

上面的n种渲染效果,大量算法,按照一定的顺序应用和处理,最终呈现

有方向性的数据流

延迟渲染deferred rendering

随着场景愈来愈复杂光源越来越多,更好的处理光源

先走一遍管线,把材质、深度、法线等信息全部存到GBuffer里,最后计算光照

但是GBuffer开销极大

Tile-based rendering

目前比较常用,像瓷砖一块一块

相当于分割成几个小块,可以单独计算GBuffer、光照,大大减少开销

Cluster-based rendering

直接对视锥空间切分,四棱柱,tile的升级版本,更大量的光源

几何buffer和材质buffer分离

GBuffer、VBuffer分离

对buffer直接渲染!!!

各种sync


保证frame buffer写完再刷,保证显示不会裂开