Games104-04 游戏引擎中的渲染实践
- 渲染概述
- 在游戏渲染系统中的挑战
- 渲染系统的对象
- 渲染管线和数据(Rendering Pipeline and Data)
- 计算投影和栅格化
- 计算阴影(Computation - Shading)
- 计算纹理采样(Computation - Texture Sampling)
- 了解GPU
- SIMD and SIMT
- GPU 结构体系
- Data Flow from CPU to GPU
- Be Aware of Cache Efficiency
- GPU Bounds and Performance
- 可渲染物体
- Building Blocks of Renderable
- Mesh在游戏引擎里面的表达
- 材质(Materials)
- 多种多样的的纹理
- 材质中十分重要的部分——shader
- 坐标系与变换
- 将材质放入Object中
- Resource Pool
- GPU Batch Rendering
- 可见性裁剪
- 纹理压缩
- Block Compressin
- 建模工具
- 新的渲染管线
- 基于聚类的网格管道(Cluster-Based Mesh Pipeline)
- 可编程网格管道(Programmable Mesh Pipeline)
渲染概述
- 游戏渲染基础:
- 硬件体系结构
- 渲染数据
- 可见性
- 材质,阴影和光照:
- PRB(SG,MR)
- 着色器变换
- 光照
- 点/定向光照
- IBL/Simple GI
- 特殊渲染:
- 地形
- 天空/雾
- 后处理
- 管道
- 正向渲染,延迟渲染和Forward+渲染 (Forward,deferred rendering,forward plus)
- 混合效应的真实管道 (Real pipeline with mixed effects)
- 环形缓冲和同步刷新(Ring buffer and V-Sync)
- 基于图块渲染(Tiled-based rendering)
在游戏渲染系统中的挑战
- 所需要渲染的游戏对象数据量十分庞大,所有东西都放在一个容器中,游戏的渲染系统十分复杂
- 深度地适配现代计算机硬件
- 保证游戏性能,稳定的帧率和高质量的分辨率
- 限制对GPU带宽和内存占用的访问,确保CPU不被渲染系统完全占用。
渲染系统的对象
渲染管线和数据(Rendering Pipeline and Data)
计算投影和栅格化
投影分为正交投影和透视投影:
栅格化:栅格化是将矢量图形格式表示的图像转换成位图以用于显示器或者打印机输出的过程。
栅(shan)格化,是一个专业术语,栅格即像素,栅格化即将矢量图形转化为位图(栅格图像)。最基础的栅格化算法将多边形表示的三维场景渲染到二维表面。
计算阴影(Computation - Shading)
代码右图对应的是GPU的结构
shader样本代码中包含以下结构:
- Constants/Parameters
- ALU algorithms
- Texture Sampling
- Branches
计算纹理采样(Computation - Texture Sampling)
分为三步:
- 第一步:使用最近的mipmap级别
- 第二步:两个mip-map映射中执行双线性插值
- 第三步:结果之间的线性插值
了解GPU
SIMD and SIMT
SIMD(Single Instruction Multiple Data):描述具有多个处理元素的计算机–同时对多个数据点执行相同操作的计算机。
SIMT(Single Instruction Mutiple Threads):并行计算中使用的一种执行模型,其中单指令、多数据(SIMD)与多线程相结合。
GPU 结构体系
- GPC(Graphics Processing Cluster):专用硬件块用来计算、栅格化、阴影和纹理处理
- SM(Streaming Multiprocessor):运行CUDA内核的GPU的一部分
- Texture Units:可以获取和过滤纹理的纹理处理单元
- CUDA Core:允许不同处理器同时工作数据的并行处理器
- Warp:一组线程
Data Flow from CPU to GPU
数据在计算机中流动是有成本的,所以尽可能的实现CPU到GPU单向传输数据,不要从显卡里面读取数据
Be Aware of Cache Efficiency
- 充分利用硬件并行计算
- 尽量避免冯·诺依曼的瓶颈
在GPU中利用缓存的机制可以大大提高其工作效率
GPU Bounds and Performance
要注意GPU性能的边界
程序应用性能的限制:
- Memory Bounds
- ALU Bounds
- TMU(Texture Mapping Unit) Bound
- BW(Bandwidth) Bound
可渲染物体
Building Blocks of Renderable
下图是对一个可渲染的物体拆分:
Mesh在游戏引擎里面的表达
通过顶点和法向量的数据形成形状。
上面的方法是一种效率比较低的存储方法,下图为高效的方法
把所有的顶点数据存放在一起,只存取顶点数据的索引值
材质(Materials)
材质模型:
多种多样的的纹理
在表达一个材质时,纹理占据了一个十分重要的地位
材质中十分重要的部分——shader
利用shader代码对材质进行不断的变化来实现多种多样的游戏世界
坐标系与变换
模型资产是基于本地坐标系生成的,最终我们需要将它们呈现到屏幕空间中。
将材质放入Object中
一个物体中可能由不同的材质组成才能表现出真实的效果,所以我们需要引入submesh(子mesh)来对不同的材质进行区分,并把相同的纹理、submesh、mesh归类在一起
利用submesh来放入不同的材质:
Resource Pool
若一个场景、物体存在多种可复用性的材质,我们一般采用Resource Pool的架构来对相同的资源进行管理,来提高效率
但是在游戏场景中我们的场景是不断变换的,GPU又非常懒,所以我们为了简化GPU的工作,对场景中的Material进行排序,这样可以提高GPU的运行效率
GPU Batch Rendering
在现代游戏引擎中,我们尽可能的把绘制运算交给GPU去运算,而不是交给CPU去运算,并且我们在运行GPU时,为了使其工作效率更高,我们要减少DrawCall的次数,所以我们会尽可能的在一次DrawCall中绘制大量的数据,此时就运用到了Batch
可见性裁剪
只将可见视野范围内的Object进行渲染来提高效率
那怎样去实现呢?
利用以下方法:
- 包围盒
- 各种算法,进行区域划分,常用的由BVH,PSV
纹理压缩
- 传统的图像压缩像JPG和PNG
- 良好的压缩率
- 图片质量
- 设计用于压缩或解压整个图形
- 游戏纹理压缩
- 译码速度
- 随机存取
- 压缩速率和视觉质量
- 编码速度
Block Compressin
- PC端的BC7的算法可以当你生成了一个纹理,可以实时地去生成压缩的纹理
- ASTC主要用于手机端
建模工具
- Maya
- Max
- Blender
- …