游戏核心之固定流水线

原创 2017年01月03日 10:20:44
笔者简介:姜雪伟,网名海洋,资深程序,CSDN社区专家,CSDN特邀编辑,畅销书作者,已出版书籍《手把手教你架构3D游戏引擎》、《Unity3D实战核心技术详解》等书籍。

笔者在1月4号将在CSDN学院开设一门公开课《算法与游戏实战》,在这里先把课程内容透露一部分给读者关于固定流水线算法。
3D游戏或者是虚拟现实逐步成为市场主流,由于IT行业的薪资普遍比较高,很多IT开发者转行到游戏开发或者说是虚拟现实开发中。但是大部分人只限于会使用引擎开发工具,比如使用Unity3D引擎或者是UE4虚幻引擎,它们能利用引擎提供的编辑器和组件快速的搭建出一款游戏,但是在遇到一些棘手问题时却是束手无策,出现这样的问题主要是因为对于一些3D的基本原理不是很清楚,接下来给读者详细介绍一下固定流水线中的矩阵算法。 固定流水线主要原理是3D模型在屏幕上的显示是按照一个固定的流程完成的,这个流程就是固定流水线。接下来主要是给读者介绍流水线中涉及到的矩阵算法,3D游戏中的模型都是美术制作的,美术制作的模型给程序使用,这个模型相对它自身来说就是局部坐标,制作的模型需要放到引擎的编辑器中这样才能制作出游戏场景也就是世界坐标系。美术制作的模型是有材质贴图,法线贴图,高光贴图等。将它们放到游戏场景中,这个过程中不影响模型自身的颜色,材质,texture坐标,但会影响模型的顶点,法线,和光线的几何分布。在世界坐标系中的物体是可以进行旋转,缩放,平移变换,这些变换都会涉及到矩阵运算,矩阵公式如下所示:
平移变换矩阵

缩放矩阵


绕X轴旋转矩阵


绕Y轴旋转矩阵

绕Z轴旋转矩阵


OpenGL 是使用列主序矩阵,即列矩阵,因此我们总是倒过来算的(左乘矩阵,变换效果是按从右向左的顺序进行)。物体在世界坐标系中变换就需要模型中的顶点与上述矩阵相乘得到,当然我们现在不需要自己去实现这些底层的运算,完成了矩阵变换后,接下来进入可视坐标系中,玩家要看到场景中的模型必须将模型放到摄像机下面,在可视坐标系中是要改变模型的顶点,法线和光线,所以这个阶段的输出是更改了模型的所有几何信息以适配出的标准视角空间。所有深度信息都来自这个视角坐标系的Z值。一旦可视坐标系确定,这个时候模型顶点颜色会被设定,任何指定的光线操作都会完成,所有这些光线参数,位置,方向,法线,顶点材质都会决定顶点的颜色,而这个阶段处理之后,每个顶点也已经有一个颜色值。可视坐标系有两种变换方式:一是透视摄像机,另一种是正交摄像机。这两种摄像机对应两个变换矩阵,一是透视变换矩阵如下所示:假设:l = left, r = right, b = bottom, t = top, n = zNear, f = zFar,有:

摄像机效果图如下所示:


接着再看看正交摄像机矩阵示意图:
假设:xmax = right, xmin = left, ymax = top, ymin = bottom, zmax = far, zmin = near,正交投影的计算可分为两步:首先平移到视锥体的中心,然后缩放。
平移矩阵:

缩放矩阵


正交投影矩阵R = S X T


提示一下,裁剪空间也是在进入可视坐标系之前完成的,再看一下视口变换如下图所示:

解释一下,clipSpace是相机裁剪完成后,读者如果使用过Unity3D引擎知道,它的视口大小是0,0,1,1,这个是被标准化处理过了,也就是图中的Normalized Device Space。但是屏幕上的坐标数值不是用0,1表示的,也就是图中的Window Space,屏幕的大小尺寸比如 640 * 480,720 * 640,1280 * 720等,它们之间有个对应关系,对应公式如下所示:

公式中的参数(xw, yw)是屏幕坐标,(x, y, width, height)是传入的参数,(xnd, ynd)是投影之后经归一化之后的点,这样你可以计算出屏幕上的点坐标。如果读者对矩阵变换不理解可以查看《线性代数》和《3D数学基础:图形与游戏开发》这两本书。固定流水线示意图如下所示:

在编程时经常会用到MVP,MV等这种系统代码定义的变量,M表示Model局部坐标系,View可视坐标系,P表示投影坐标系也就是裁剪。它是引擎已经实现好的,提供了接口给开发者使用。在程序中实现的效果如下图所示:

CPU是单线程的,它只能一步一步处理的,按照这个固定的流程就可以渲染出游戏场景在屏幕上显示出来。

总结:---  
上述讲述的是固定流水线,其实由于引擎已经为开发者封装好了,这些实现都是在引擎内部处理的,对外只提供了接口,开发者只需要调用接口就可以实现,笔者认为要想学好一门技术,必须做到精才可以,后面再给读者介绍一下可编程流水线。
版权声明:本文为博主原创文章,未经博主允许不得转载。

GPU工作原理,可编程渲染管线,图形流水线和GPU架构

http://imgtec.eetrend.com/blog/3629
  • leoysq
  • leoysq
  • 2016年05月19日 22:38
  • 6340

指令集及流水线

1.地址总线数据总线和机器字长 2.机器语言和指令集 3.CISC 和 RISC 4.指令的执行 5.流水线作业...
  • phunxm
  • phunxm
  • 2013年05月27日 17:26
  • 14628

Unity3D Shader之路 写Shader前必须要知道的事情 渲染流水线的概括

版本:unity 5.4.1  语言:Unity Shader   总起:     最近花了一个月的时间把《Unity Shader 入门精要》看完了,没怎么写博文,因为写得太好了,看得有点废寝忘食了...
  • u012632851
  • u012632851
  • 2017年04月12日 12:59
  • 2184

游戏核心之固定流水线

笔者简介:姜雪伟,网名海洋,资深程序,CSDN社区专家,CSDN特邀编辑,畅销书作者,已出版书籍《手把手教你架构3D游戏引擎》、《Unity3D实战核心技术详解》等书籍。 笔者在1月4号将在...
  • qq_36617521
  • qq_36617521
  • 2017年01月16日 08:41
  • 103

三维观察流水线的理解

在计算机图形学中,渲染图形的过程可以分为两大类:第一步是T&L过程全称是Transforming and Lighting,即顶点的坐标变换和光照过程,通常称为顶点变换流水线;第二步就是光栅化,对于光...
  • Linear_Luo
  • Linear_Luo
  • 2016年08月17日 15:55
  • 1244

【WebGL初学系列之一】WebGl基础知识

在今年中,Web技术已经得到了巨大的发展,现在许多
  • ixshells
  • ixshells
  • 2014年09月14日 14:34
  • 1469

怎么理解STM8的三级流水线架构?

我们知道STM8使用了三级流水线来运行它的指令代码,那要怎么样来理解三级流水线的意思呢?三级流水线是以下三级: 1. 取指令 2. 指令解码和寻址 3. 指令执行 我们来打个炒鸡蛋的比方...
  • u010093140
  • u010093140
  • 2015年11月25日 21:28
  • 1215

fpga流水线理解

流水线不会减小相应模块1的延时,但是会减少系统其他模块2的延时,提高系统的吞吐率。以乘法操作为例,假设做一次乘法需要3ms并且是在一个时钟周期中完成,则会导致时钟周期也只能为3ms,同时系统中还有一个...
  • hutiantian
  • hutiantian
  • 2014年07月16日 20:12
  • 1780

ARM的三级流水线结构(一)

ARM的三级流水线结构 PC=PC+8分析
  • zhi_yong_chen
  • zhi_yong_chen
  • 2016年05月04日 13:19
  • 1821

3D图形渲染管线

3D图形渲染管线 分类: 3D Programming2010-03-25 21:34 4972人阅读 评论(4) 收藏 举报 图形direct3d测试transformation编程pr...
  • Highning0007
  • Highning0007
  • 2016年09月10日 22:05
  • 2150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:游戏核心之固定流水线
举报原因:
原因补充:

(最多只允许输入30个字)