网络游戏引擎实现专业教程理论讲解部分Ver3.12.1Direct3D中的基础概念2.1.10D3D中的空间第009课Direct3D基础1.本地空间本地空间(或者称为模型空间)指定义组成物体的三角形列表时所使用的坐标系统。本地空间在简化模型处理工作上相当有用。例如:本地空间中创建物体时,不需要考虑物体的位置、大小以及与世界空间中其他物体的关系。2.世界空间在完成各种模型的创建后,所有的物体都只在相应的本地空间中,需要把这些模型组合到一起,形成一个场景。这个统一的坐标系统所决定的空间称为世界空间。物体在世界空间里除了自身的属性外,更重要的是要考虑和其他物体之间的位置关系等。2.1Direct3D中的基础概念2.1.10D3D中的空间第009课Direct3D基础3.视图空间Direct3D允许在场景中设置一个虚拟摄像机,决定我们看到的场景,由虚拟摄像机决定的空间称为视图空间。在世界空间中,世界空间的坐标原点和坐标轴完全由程序员决定,对于Direct3D而言,我们更需要考虑的是我们能看到些什么。4.视口游戏中,视口经常是整个屏幕,但是视口也可以是屏幕上的矩形区域。可能是屏幕的一部分或者是处于窗口模式下窗口的客户区。视口与其所在的窗口相关并且通过所在窗口的相对坐标来进行描述,通常,视口坐标是按照像素的方式取值的。渲染图形的过程非T&L顶点矩阵照明渲染状态T&L阶段T&L顶点纹理图元更多渲染状态光栅化处理阶段渲染的象素2.1Direct3D中的基础概念2.1.11渲染流水线Direct3D渲染图形可以分为两个阶段:变换和照明(T&L)光栅化处理第009课Direct3D基础2.1Direct3D中的基础概念2.1.11渲染流水线第009课Direct3D基础转换和照明(T&L)在这个阶段里,每个对象的顶点被从一个抽象的、浮点坐标空间转换到基于像素的屏幕空间,并考虑用于渲染该场景的虚拟摄像机的属性。另外,可对顶点应用不同类型的照明效果。(其他诸如裁剪和视口缩放也都放在第一个阶段进行)光栅化处理图元将这些经过转化并添加了照明效果的顶点组织为点、线和三角形。光栅化处理程序将绘制结果显示在屏幕,同时应用纹理映射并添加多种属性。光栅化处理程序同时决定深度缓冲的结果,判断哪些像素是用户可见的,哪些被其他像素所遮掩。2.1Direct3D中的基础概念2.1.11渲染流水线第009课Direct3D基础对于Direct3D,上述过程通常被认为是一个渲染流水线。未经转换和照明的顶点从一端进入,在内部这些顶点将完成几个连续操作。然后,经过转换和照明处理的顶点从另一端出来。渲染流水线的大部分过程都是在进行坐标转换,将顶点从一个坐标系转换到别的坐标系。在使用Direct3D来进行转换时,用户只需要提供描述系统转换的完整转换矩阵,通过IDirect3DDevice-SetTransform方法来实现相应的变换。HRESULTSetTransform(D3DTRANSFORMSTATETYPEState,//变换的类型CONSTD3DMATRIX*pMatrix//进行变换的变换矩阵);2.1Direct3D中的基础概念2.1.11.1世界变换2.1.11渲染流水线第009课Direct3D基础渲染流水线的第一步是将物体从本地坐标系转换到世界空间,这一过程称为世界变换。它的作用是:把独立的物体放在一个统一的坐标系内,组合成一个完整的场景。在世界变换中主要完成的是对模型的转换,包括旋转、缩放、平移等。设置世界变换的函数如下:g_pD3Ddevice-SetTransform(D3DTS_WORLD,&matWorld);g_pD3DDevice为有效的Direct3D设备指针matWorld代表一个变换矩阵。2.1Direct3D中的基础概念2.1.11.2视图变换2.1.11渲染流水线第009课Direct3D基础把物体转换到世界空间后,接下来就需要确定视图空间,这个过程称为视图变换。首先我们需要确定虚拟摄像机的属性。在Direct3D中,关于虚拟摄像机的属性主要包括:摄像机位置、摄像机的朝向和摄像机的正方向,分别用向量表示。可以从以下函数生成视图变换的矩阵。D3DXMATRIX*D3DXMatrixLookAtLH(D3DXMATRIX*pOut,//输出用于视图变换的矩阵CONSTD3DXVECTOR3*pEye,//摄像机的位置CONSTD3DXVECTOR3*pAt,//摄像机朝向的位置CONSTD3DXVECTOR3*pUp//摄像机的正方向);2.1Direct3D中的基础概念2.1.11.2视图变换2.1.11渲染流水线第009课Direct3D基础接下来,使用下面的函数来设置视图变换。g_pD3DDevice-SetTransform(D3DTS_VIEW,&matView);g_pD3DDevice为有效的Direct3D设备指针matWorld代表一个视图变换矩阵把摄像机观察到的三维景像显示在二维的平面上,这种三维到二维的变换就是投影变换。实际应用中,主要的投影变换有两种类型:2.1Direct3D中的基础概念2.1.11.3投影变换2.1.11渲染流水线第009课Direct3D基础正交投影透视投影2.1Direct3D中的基础概念2.1.11.3投影变换2.1.11渲染流水线第009课Direct3D基础1.正交投影在正交投影中,投影向量与观察平面垂直,物体坐标沿观察坐标系的z轴平行投影到观察平面上,观察点和观察平面的距离不影响物体的大小。D3DXMATRIX*D3DXMatrixOrthoLH(D3DXMATRIX*pOut,//输出用于正交投影的变换矩阵FLOATw,//取景体宽度FLOATh,//取景体高度FLOATzn,//取景体离摄像机的最近距离FLOATzf//取景体离摄像机的最远距离);可以使用下面的函数来得到正交投影的变换矩阵:第009课Direct3D基础2.1Direct3D中的基础概念2.1.11.3投影变换2.1.11渲染流水线1.正交投影接下来,使用下面的函数来应用正交投影变换。g_pD3DDevice-SetTransform(D3DTS_PROJECTION,&matProj);g_pD3DDevice为有效的Direct3D设备指针matProj代表一个投影变换矩阵第009课Direct3D基础2.1Direct3D中的基础概念2.1.11.3投影变换2.1.11渲染流水线2.透视投影透视投影的特点:是越远的物体在投影平面上的成像越小,这样生成的投影图更加具有纵深感。透视投影的观察范围是一个平截台体。平截台体是指一个去除了尖头的锥体。在计算机图形学中,观察平截面的概念是,锥体的尖头位于虚拟摄像机的位置,而摄像机指向该锥体的底部,将锥体的四个侧面向屏幕的四边投影,并切除远近裁剪平面位置的锥体的前后部分。得到的观察平截面代表摄影空间在渲染场景中的可见部分。实际应用中,如果我们要实现一个三维的场景,则我们通常使用透视投影。第009课Direct3D基础g_pD3DDevice-SetTransform(D3DTS_PROJECTION,&matProj);g_pD3DDevice为有效的Direct3D设备指针matProj代表一个投影变换矩阵。2.1Direct3D中的基础概念2.1.11.3投影变换2.1.11渲染流水线2.透视投影下面的函数用于定义透视变换的矩阵:D3DXMATRIX*D3DXMatrixPerspectiveFovLH(D3DXMATRIX*pOut,//输出用于透视投影的变换矩阵FLOATfovY,//摄像机镜头的夹角(在y轴上的成像角度)FLOATAspect,//平截台体的纵横比FLOATzn,//近平截面的距离FLOATzf//远平截面的距离);接下来,使用下面的函数来应用透视投影变换:顶点从均匀转化为非均匀:在顶点坐标信息里除顶点位置信息外再加一个W分量坐标,设定其初始值为1.0。在顶点通过T&L流水线中的多个矩阵传送时,w坐标将改变它的值。w值不为1.0的顶点是均匀的。当转换换结束时,就需要把顶点恢复为不均匀的形式,这是通过x、y和z坐标除以w完成的。w坐标的倒数也被存储起来。这个过程非常必要,因为光栅处理程序需要得到以非均匀x、y和z坐标以及均匀w的倒数值(reciprocal-of-homogeneous-w,RHW)表示的顶点。第009课Direct3D基础2.1Direct3D中的基础概念2.1.11.3投影变换2.1.11渲染流水线2.透视投影空间变换的最后一步是通过定义屏幕显示区域的实际宽、高等参数,将顶点从投影坐标转换为最终显示的以像素为单位的屏幕坐标。第009课Direct3D基础2.1Direct3D中的基础概念2.1.11.4视口变换2.1.11渲染流水线第009课Direct3D基础通常情况下,参数MinZ和MaxZ被设为0和1.0f,即取景范围的最近和最远距离,表示在投影取景范围内,顶点只要满足了x∈(-1.0f,1.0f)、y∈(-1.0f,1.0f)和z∈(0.0f,1.0f),就能通过裁剪,予以显示。在Direct3D中定义的视口结构:2.1Direct3D中的基础概念2.1.11.4视口变换2.1.11渲染流水线typedefstruct_D3DVIEWPORT9{DWORDX;//视口区域的左上角x坐标DWORDY;//视口区域的左上角y坐标DWORDWidth;//视口区域的宽度DWORDHeight;//视口区域的高度floatMinZ;//视口内景物的最小深度值,0-1.0之间,通常为0floatMaxZ;//视口内景物的最大深度值,0-1.0之间,通常为1}D3DVIEWPORT9;第009课Direct3D基础D3D通过IDirect3DDevice9::SetViewport()函数设置视口:2.1Direct3D中的基础概念2.1.11.4视口变换2.1.11渲染流水线HRESULTSetViewport(CONSTD3DVIEWPORT9*pViewport//视口);经过转换后,顶点P的屏幕二维坐标x’,y’为:x,=x×Width/2+X+Width/2y,=y×Height/2+Y+Height/2z’值为:z,=z×(MaxZ-MinZ)+MinZ第009课Direct3D基础SetViewport()相当于把投影空间的顶点P(x,y,z)乘以以下变换矩阵:2.1Direct3D中的基础概念2.1.11.4视口变换2.1.11渲染流水线第009课Direct3D基础2.1Direct3D中的基础概念2.1.11.5光栅化2.1.11渲染流水线经过视口变换,我们获得了一系列2D三角形。光栅化阶段被用于在描绘三角形时,计算每个像素的颜色值。光栅化过程需要进行大量计算,并通常由特定的图像硬件来完成。光栅化的结果时一个2D图像,将被显示在屏幕上。第009课Direct3D基础2.1Direct3D中的基础概念2.1.11.5光栅化2.1.11渲染流水线一个三角形在屏幕中被光栅化第009课Direct3D基础1、D3D中的变换空间主要包括:(ABCD)A)本地空间B)世界空间C)视图空间D)视口2、将模型置入场景中的变换称之为:(A)A)世界变换B)视图变换C)投影变换D)视口变换3、设置摄像机位置进行的变换是(B)A)世界变换B)视图变换C)投影变换D)视口变换4、设置摄像机观察范围的变换是(C)A)世界变换B)视图变换C)投影变换D)视口变换5、游戏场景中通常采用的投影变换是(B)A)正交投影B)透视投影6、我们可以通过视口变换在窗口的特定区域显示图形。(T)•小测验:(答案)