对于游戏开发者初学者而言,游戏引擎是个巨大无比的黑盒。
初学阶段拖拖拽拽加一点代码就能简单运行一个小游戏。
但是如果不清楚游戏引擎的核心原理,对于一些稍微深一点操作有时候又会无从下手。
所以明白游戏引擎或者说渲染引擎的基本原理非常重要。
但是即使是从OpenGL学起,学习曲线也是十分陡峭。因为涉及到多个知识点的储备,比如线性代数,矩阵计算,PBR(基于物理的渲染)
所以现在从头开始写一个非常非常简单的游戏引擎。或者说叫渲染器。完全模拟整个游戏引擎/渲染器的整个原理,也不用OpenGL等高级的API,也不需要性能优化,目的是展现原理,期望把一些概念用最简单的语言说出来。
本系列文章的目的是让对游戏引擎感兴趣的可以照葫芦画瓢写一个最简单的游戏引擎。
即使不是程序员,我也期望能用最简单的语言,让高中生也能了解,到底什么是游戏引擎?它是怎么工作的。
什么是游戏引擎
通过构建一个3D或者2D的场景,将场景里面的物体渲染成2D的图像信息,并展现出来。这是我理解的对游戏引擎最简单直观的理解。
我常常将游戏引擎比作照相的原理是一模一样,现实世界中众多三维物体,相机按下快门后,得出一张图片。
而游戏引擎的工作,是运用数学方法是中将这些三维物体用数学方法去表示,通过计算还原成了一张二维的图形数据(称为帧Frame)。如果这些不停的生成数据帧像电影一样播放,展示在屏幕前,就形成了游戏引擎。
这些二维图片每秒播放的次数就是我们常说的FPS(Frame Per Second)了。
也就是说游戏引擎就是帮我将三维的数据转换成二维图形。(有朋友说不是还有魂斗罗这样的二维游戏吗?其实二维的数据也可以看成三维数据的固定视角下的表现,所以这里统称三维图形)
以unity 自带的卡丁车游戏为例子。
场景中布置了非常的多的三维模型,比如树木车子。
当运行时,将实时计算的三维数据最终转换成二维的图形信息
什么是渲染管线?
而将这些三维数据,通过数学计算转换成二维图形的过程,我们可以称为渲染管线(Render pipeline). 初学者第一次接触管线这个名词就非常陌生,且奇怪。其实可以形象的理解为这个渲染的过程是类似于水流或者流水线,或者一道菜,每个步骤都是非常固定且统一的,最终的成功就是我们要的二维的图像。
来看下图,比如这是一个简单的渲染管线的示意图
我们的目的是渲染最终的一个三角形,最开始时我们只有表示这个三角形的三个点。
每个点称为顶点(Vertex)。
我们这里先不太展开什么是着色器(Shader),可以简单的理解为渲染管线提供了可供修改数据的小程序。
OK。管线开始一个一个介绍
- 开始我们有一堆顶点数据
- 交由给顶点着色器(可以顶点数据做一些处理)
- 三个点组成三角形(图元)
- 交由给几何着色器(可以图元数据做一些处理)
- 几何图片里面的像素全部填满(这一步称为光栅化)
- 给他一点颜色(片段着色器(fragment shader),fragment就是一粒粒的意思,可以引申为细化的意思)
- 做一些混合和剔除(比如透明的多个物体叠在一起)
- 完成
哎。不对,不是三维图形转换成二维图形并呈现出来吗?并没有体现三维转化成二维图形的这个过程啊?
其实三维图形的数据(顶点)一般在会在顶点着色器中计算成为二维的点。或者在传给管线之前已经是从三维转化成二维的数据了。这里面都是可以的。
但是接下来的文章,为了简单化,刚开始我并不打算模拟一个渲染管线。
我们直接模拟如何将一个三维的数据还原成一张二维的图形。还原这样一个最最简单的游戏引擎。