游戏引擎原理与实践 03:空间变换与3D渲染流水线入门
发布时间:2026/10/1 7:16:49 作者:尧图编辑部 阅读量:1,286

游戏引擎原理与实践 03空间变换与3D渲染流水线入门Bilibili 同步视频 搞懂坐标系一切 3D 运算的起点 空间变换线性变换与仿射变换1. 线性变换2. 仿射变换游戏物体的万能变换3D 渲染流水线三角形如何变成屏幕画面图形 API 与引擎工作流DirectX OpenGL汇编指令在图形开发的妙用完整引擎工作流课后小思考题小结✨很多刚踏入游戏开发的朋友总会被 3D 坐标系、矩阵变换、渲染管线一堆概念搞得头昏脑胀。明明代码复制过来模型旋转却歪到姥姥家坐标一顿计算物体直接飞到屏幕外面。今天我们就从引擎最基础的底层原理出发拆解 3D 空间变换、渲染流水线、API 与引擎工作流帮你打通游戏图形的任督二脉。Bilibili 同步视频游戏引擎原理与实践 03空间变换与3D渲染流水线入门 搞懂坐标系一切 3D 运算的起点3D 坐标系由一个原点 三组互相正交的基向量构成空间内任意一点都可以依靠这三根轴来描述。这里就有一个新手高频踩坑点左手坐标系 VS 右手坐标系。图 1左手坐标系与右手坐标系示意。不同游戏引擎会选用不同坐标系选错坐标系后续旋转、矩阵计算全部会出错。不少引擎采用左手坐标系也有引擎使用右手坐标系轴向上也有区分有的引擎 Y 轴向上也存在 Z 轴向上的设计。不用死记硬背手指姿势只要记住开发前先确认引擎的坐标系约定这是所有运算正确的大前提。欧拉角也是和坐标系强绑定的概念比如 Yaw偏航、Pitch俯仰、Roll翻滚。旋转顺序直接决定最终结果本书示例引擎的顺序是 Roll→Pitch→Yaw也就是 z 轴 → x 轴 → y 轴。同时旋转方向也要留意本文约定正角度顺着轴向看过去是逆时针旋转。 空间变换线性变换与仿射变换空间变换是 3D 引擎的灵魂也是大部分人卡壳的重灾区。我们先分清两个核心概念线性变换、仿射变换。1. 线性变换线性变换F FF必须满足两条铁律简单理解向量相加再变换等价于分别变换再相加向量数倍后变换等价于变换后再数倍。像F ( x ) 3 x F(x)3xF(x)3x就是典型的线性变换。3D 中两大经典线性变换缩放变换把点 / 向量的 x、y、z 各个分量分别乘上缩放系数。⚠️注意原生线性缩放永远是相对于坐标原点执行。如果想要相对于某一个自定义点缩放单纯线性变换做不到。旋转变换可以写成F ( a ) a M F(a)aMF(a)aMM MM为 3×3 正交旋转矩阵。任意绕任意方向轴的旋转都可以拆解成绕 x/y/z 三个坐标轴的组合旋转。看下这个直观例子同样是放大 2 倍一个相对于原点另一个相对于点( 2 , 0 ) (2,0)(2,0)。图 2(a) 为相对于原点放大 2 倍(b) 相对于 (2,0) 点放大 2 倍。后者不再属于线性变换属于仿射变换。想要实现非原点的缩放需要先把物体平移把目标点挪到原点 → 执行缩放 → 再平移还原位置。这一套组合就是仿射变换。2. 仿射变换游戏物体的万能变换仿射变换公式F ( a ) M a T F(a)MaTF(a)MaT也就是线性变换之后追加一次平移。游戏里绝大多数物体变换都是仿射变换。小知识投影变换不属于仿射变换。仿射变换有个非常关键的执行顺序。不管你代码写的顺序是平移再缩放再旋转数学上都可以等价转换为先缩放 → 再旋转 → 最后平移。几乎所有游戏引擎都遵循这套标准顺序。F ( a ) a S M T F(a)aSMTF(a)aSMTS SS代表缩放矩阵M MM代表旋转矩阵T TT代表平移向量。齐次 4×4 矩阵可以把缩放、旋转、平移全部打包到一个矩阵内M t r a n s f o r m M s c a l e t i m e s M r o t a t e t i m e s M t r a n s l a t e M_{transform}M_{scale} times M_{rotate} times M_{translate}MtransformMscaletimesMrotatetimesMtranslate✨小补充数据存储上骨架层级计算常用矩阵动画数据会分开存储缩放 (3D 向量)、旋转 (四元数)、平移 (3D 向量)GPU 蒙皮计算的时候再统一转换成矩阵。另外还有左乘右乘大坑本文示例全部采用**向量右乘矩阵 **v ′ v M vvMv′vM不同引擎约定不同抄矩阵代码务必核对。原始顶点v缩放S旋转M叠加平移T变换后顶点v图 3仿射变换标准执行流程先缩放、再旋转、最后平移。3D 渲染流水线三角形如何变成屏幕画面一个模型上的三角形是怎么一步步出现在你的显示器上面这就是 3D 流水线干的活。就算有可编程着色器改写部分逻辑整体的基础脉络依然不变。模型空间原始顶点、UV、法线世界空间物体摆放到场景相机空间以摄像机为原点观察场景剔除不可见面投影空间近大远小投影变换屏幕空间转为2D像素深度测试、混合、光照计算输出屏幕画面图 4经典 3D 渲染流水线流程示意图模型空间美术在建模软件制作模型时的坐标系。每个模型顶点都基于自身原点定义。世界空间把模型放到游戏场景施加缩放旋转平移把顶点换算到整个游戏大世界的坐标系。相机空间观察空间切换视角把所有物体转换到以摄像机为原点的坐标系同时把完全看不到的面片做剔除。投影空间执行透视或者正交投影实现我们熟悉的近大远小效果。屏幕空间把三维投影结果映射到二维屏幕像素。这里会做深度测试处理物体遮挡执行模板测试、Alpha 混合、雾化、光照等像素阶段运算。着色器出现之后流水线不再完全死板。顶点、像素阶段逻辑都可以自定义比如光照可以放到顶点着色器也可以放到片段着色器。图形 API 与引擎工作流DirectX OpenGLDirectX (D3D)、OpenGL 并不是游戏引擎它们是和显卡硬件打交道的底层函数库。它们封装显卡能力给上层提供调用接口榨干 GPU 性能。学习小技巧如果直接啃 D3D/OpenGL 觉得晦涩难懂可以先尝试手写一个 CPU 软渲染器模拟显卡的管线逻辑。吃透原理再上手硬件 API难度会大幅下降。汇编指令在图形开发的妙用汇编在现代图形开发依旧有三大实用场景SIMD 单指令多数据流指令加速海量向量、矩阵数学运算程序崩溃没有调试符号时通过崩溃处汇编、寄存器值定位 BUG着色器反编译逆向学习商业游戏的特效实现思路。完整引擎工作流游戏资源不是凭空在引擎内生成是一套多软件协作的流水线建模软件 (3ds Max)产出模型三角面数据贴图软件 (Photoshop)制作纹理贴图高模雕刻软件 (ZBrush)烘焙法线贴图动作软件制作骨骼蒙皮、动画片段外部资源导入引擎之后引擎内部再拆分出材质编辑器、特效编辑器、场景编辑器、资源管理器等模块把模型、贴图、动画组装成场景、游戏对象再叠加物理、AI、脚本、UI最终输出成品游戏。游戏引擎内部外部美术软件建模软件贴图软件ZBrush高模动作制作软件模型贴图动作材质场景编辑器动画树游戏对象脚本AI物理最终游戏图 5游戏引擎资源工作流美术资源导入引擎经过组合加工产出游戏内容课后小思考题读完这篇不妨可以尝试思考几个问题检验自己的理解程度如何计算一个点到平面的距离已知两个向量怎么求出它们之间的夹角为什么三角形和相机近裁剪面相交的时候需要对三角形做切割那和远平面相交和视口左右上下边界相交呢可以拿 Unity 简单做个 Demo完整走一遍从导入模型到产出简单小游戏的完整流程感受整套工作流。小结✨空间变换、渲染流水线是游戏图形的地基。坐标系、矩阵、仿射变换看着公式吓人但只要理清顺序、分清各个空间就会发现逻辑并不复杂。很多开发踩坑本质都是忽略坐标系差异、变换顺序搞错。理解底层原理不管是使用现成引擎还是尝试自研引擎都会事半功倍。