笔者简介:姜雪伟,网名海洋,资深程序,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是单线程的,它只能一步一步处理的,按照这个固定的流程就可以渲染出游戏场景在屏幕上显示出来。
总结:---  
上述讲述的是固定流水线,其实由于引擎已经为开发者封装好了,这些实现都是在引擎内部处理的,对外只提供了接口,开发者只需要调用接口就可以实现,笔者认为要想学好一门技术,必须做到精才可以,后面再给读者介绍一下可编程流水线。

游戏核心之固定流水线相关推荐

  1. 游戏引擎算法探究:游戏核心之固定流水线

    3D游戏或者是虚拟现实逐步成为市场主流,由于IT行业的薪资普遍比较高,很多IT开发者转行到游戏开发或者说是虚拟现实开发中.但是大部分人只限于会使用引擎开发工具,比如使用Unity3D引擎或者是UE4虚 ...

  2. Unity制作格斗游戏核心思路总结

    http://anchorart9.com/2016/05/22/unity%E5%88%B6%E4%BD%9C%E6%A0%BC%E6%96%97%E6%B8%B8%E6%88%8F%E6%A0%B ...

  3. 吴昊品游戏核心算法 Round 16 ——吴昊教你玩口袋妖怪 第三弹 地洞谜题

    这样的场景我们应该经常遇到的吧,哈哈! 口袋妖怪的地洞要算是最令人讨厌的了,因为,有些地洞是全黑的,你即使用了闪光灯(必选道具#03),你有时也只能用GBA外壳的荧光屏作为道具才能将整个地洞看清楚. ...

  4. Unity_游戏核心机制分析

    王者荣耀游戏核心机制分析 一.这款游戏是什么 分析一个游戏的核心机制,首先我们得知道这款游戏是什么,这是从百度百科上搜索得到的关于这款游戏的资料:<王者荣耀>是由腾讯游戏天美工作室群开发并 ...

  5. 吴昊品游戏核心算法 Round 18 —— 吴昊教你玩Zen Puzzle Garden

    如果你认为无法因为玩一个电脑游戏而达到精神的顿悟,你可能是正确的.不过你完全可以试着解决一个禅宗花园发生的难题,从而达到静心的精神状态.   这个游戏是获得2003年独立游戏节提名的精品游戏,在注重游 ...

  6. 游戏核心编程之一 概述

    第一节.                                    概述 随着计算机技术的发展,计算机从高技术的神坛上走下来,走进我们的家庭,走进我们 的娱乐生活中.在家用计算机的使用中, ...

  7. Java游戏核心架构之通信架构

    通信框架选择 Java游戏通信一般是使用目前两个比较流行的底层通信架构:Netty和Mina. 有意思的是这两个框架都是出自同一个人之手[Trustin Lee],这两个框架的线程模型基本是一致的都是 ...

  8. 吴昊品游戏核心算法 Round 14 —— (转载)著名的益智游戏大集结

    著名的益智游戏集合(神采飞扬光谷店)    推箱子 推箱子的规则 KDE内建的推箱子游戏KSokoban第一个<推箱子>的游戏规则,则是扮演工人的玩家,以"推"的方式, ...

  9. Linux环境下连连看游戏代码,C++实现连连看游戏核心代码

    这两天研究了一下连连看游戏的源代码,感觉它挺简单的,主要就是判断选中的两张图片能否消去.我参考了网上的源代码(抱歉的是,不记得当时下载的网址了,在此对原作者表示深深的歉意!),然后自己把核心代码整理如 ...

最新文章

  1. TensorRT 7.2.1 开发概要(下)
  2. 分布式事务:分布式事务原理概述
  3. Database之SQLSever:SQL命令实现的高级案例集合之单表/多表(筛选、统计个数)之详细攻略
  4. lombok pom.xml依赖
  5. 【Python】安装配置Anaconda
  6. css div滚动_如何使用CSS创建可垂直滚动的div?
  7. 利用Azure backup备份和恢复Azure虚拟机(1)
  8. bzoj 3679: 数字之积
  9. 2010.2.28 OA 项目组工作报告
  10. |洛谷|动态规划|P2014 选课
  11. Spring xml文件配置——创建bean的三种方式及作用范围、生命周期
  12. ctf攻防渗透-加密-栅栏密码
  13. NLP情感分析之情感分类
  14. 真是其了怪的jwplayer
  15. html 圣诞节贺卡模板,圣诞节立体贺卡模板大全
  16. 深度学习:行为识别综述
  17. Unity实战篇:实现LOL英雄的移动方式。
  18. git常用命令(持续更新)
  19. vue-router 采坑记录
  20. Android中集成支付宝

热门文章

  1. 趣图:新手使用 C++ 指针时
  2. 天气预报webservice
  3. 基于52单片机的超声波测距模块(hc-sr04超声波测距模块+1602液晶显示器)
  4. countif函数的使用方法及实例视频教程
  5. 软件定义网络(Software Defined Network,SDN)
  6. 如何在比赛中告别遗憾?
  7. python依赖打包
  8. Java程序员可以从事的岗位有哪些?
  9. Burst(突发)传输
  10. 大学生活,该如何度过?