摘要:
早在1990年,无处不在的交互式3D图形还只是科幻小说里的东西。十年后,基本上每台新电脑都包含一个图形处理单元(GPU,即Graphics processing unit)。直到今天,GPU的原始计算能力已经超越最强大的CPU,并且差距还在稳步增大。今天,GPU可以直接使用图形硬件来实现许多并行算法。那些利用底层计算能力的适当的算法常常会获得巨大的速度提升。任何3D图形系统的任务都是根据一个场景的描述来合成一张图片 --- 对实时渲染图形学(例如游戏)来说是每秒60张。这个场景包含了可观察的几何图元以及灯光照亮场景的描述,每个对象反射光照的方式和观察者的位置、朝向。图形管线输入大多数实时图形系 阅读全文
摘要:
游戏中,经常会有这样的需求,即播放一段电影,给玩家更好的体验。比如摄像机朝向某两个NPC,两个NPC在那里交谈之类的。在用Unity3D制作游戏的过程中,也经常会遇到这样的需求,所以在此花时间搭建了一个简单的电影模式框架,目的在于较方便的构建游戏中需要的电影模式需求。此框架的构想是这样的:电影由一个个关键帧组成,每个关键帧代表一种电影模式功能,如摄像机的动画,角色的动画等等。此框架中提供了简单的摄像机关键帧。我们在Unity3D中完成所有关键帧的编辑,并且存为电影文件,然后在游戏中就可以直接读取文件进行播放了。下面就简单的介绍一下。首先打开编辑器,从Movie菜单中选择Create:随后在Hi 阅读全文
摘要:
51.栈和堆是存放变量与常量的地方,它们有截然不同的生命期语义。52.栈是用来存放局部变量和参数的内存块,当一个函数被调用和退出时,栈就会逻辑增长和减小,考虑下面的函数:1 static int Factorial( int n )2 {3 if ( 0 == n )4 {5 return 1;6 }7 8 return ( n * Factorial(n-1) );9 }这是一个递归函数,也就说它会自己调用自己。每次函数被调用时,就会有一个新的int参数被分配在栈上,而当函数退出时,int参数被释放。53.堆是用来存放对象(也就是引用类型的实例... 阅读全文
摘要:
最近开始学习Unity开发,由于以前一直都是从事C/C++开发,所以对于Unity的脚本语言方面,选择了最相近的C#。由于从头开始学习C#是没有必要的,所以就恶补了一下必须的C#知识^-^1.C#中使用//(双斜杠)来表明本行的剩余部分代表注释。2.C#中语句是按顺序执行的,每条语句以分号结尾。3.C#中的函数执行一系列语句的行为,称为语句块---一对大括号中包含0条或多条语句。4.一个函数可以通过定义参数来从调用者处接受输入数据,也可以通过定义返回类型来输出数据给调用者。5.Main函数定义为执行程序的默认入口点。Main函数可以不返回任何值,也可以返回一个整数给执行程序环境。Main函数也 阅读全文
摘要:
在Programming WindowsChapter 14 Blow-Up的程序中,在完成屏幕截取后,作者使用如下代码复制屏幕内容到位图: HDC hdc = GetDC( _hWnd ); HDC hdcMem = CreateCompatibleDC( hdc ); hBitmap = CreateCompatibleBitmap( hdc, abs(ptEnd.x-ptBeg.x), abs(ptEnd.y-ptBeg.y) ); SelectObject( hdcM... 阅读全文
摘要:
本例中我们使用的纹理如下:Bezier曲线大家应该都很熟悉了,Bezier曲线由4个控制点定义,Bezier曲线的数学定义为:其中,p0~p3定义了4个控制点,b0~b3为伯恩斯坦多项式的项,s的范围为0.0~1.0从而覆盖了曲线上的所有点,如图:伯恩斯坦多项式的形式如下:在3D世界中,我们需要用Bezier曲面来代替Bezier曲线,由Bezier曲线扩展到Bezier曲面是十分简单的,只需将4个控制点扩展为4*4控制网格即可,Bezier曲面的数学定义如下:其中,p0~p15代表4*4控制网格上的16个控制点,b0~b3与Bezier曲线一样,代表伯恩斯坦多项式的项,s与t代表2个方向,范 阅读全文
摘要:
渲染管线负责执行一系列必要的步骤从而把3D场景转换为可以在显示器上显示的2D图像。在Direct3D中,渲染管线的步骤大致如下:(1)局部坐标系到世界坐标系假设我们在制作一款游戏,现在,要求构建一个铁匠铺用来放在游戏场景中。我们不可能在游戏场景(世界坐标系)中构建铁匠铺,因为我们不知道它会被放在哪里,大小如何,以及朝向哪里。所以,我们在局部坐标系中构建铁匠铺,所谓局部坐标系就是以物体本身为中心的坐标系,这样的话,我们就不用考虑铁匠铺在游戏场景中的因素。下图显示了一个立方体在局部坐标系下的描述:一旦我们在局部坐标系中构建完物体后,我们就把它放在世界坐标系中,为了完成这个步骤,我们需要构建一个世界 阅读全文
摘要:
转自CSDN:http://blog.csdn.net/wallwind/article/details/68899171.引用计数算法 引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量,当有一个指针指向自己时计数值加1;当删除一个指向自己的指针时,计数值减1,如果计数值减为0,说明已经不存在指向该对象的指针了,所以它可以被安全的销毁了。可以很直观的用下面的图表示: 引用计数算法的优点在于内存管理的开销分布于整个应用程序运行期间,非常的“平滑”,无需挂起应用程序的运行来做垃圾回收;而它的另外一个优势在于空间上的引用局部性比较好,当某个对象的引用计数值变... 阅读全文
摘要:
(1)枚举默认为unsigned int类型,我们可以手动为枚举指定类型,如:enum Attr : char{ ATTR_LV = 120,};(2)我们可以使用泰勒展开式快速计算两点间距离:int fastDistance2D( int _nX1, int _nY1, int _nX2, int _nY2 ){ // this function computes the distance from _nX1, _nY1 to _nX2, _nY2 with 3.5% error // first compute the absolute value of (_nX2 - ... 阅读全文
摘要:
正如我们所知道的,Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB) < Dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置Dis(AB) = Dis(AX) + Dis(XB),这样一来,当我们遍历完所有节点 阅读全文