games104-简化的引擎架构和渲染组件
简化的架构
- 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写完再刷,保证显示不会裂开