ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:787.83KB ,
资源ID:27177083      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27177083.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(重庆大学DirectX复习资料.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

重庆大学DirectX复习资料.docx

1、重庆大学DirectX复习资料DirectX复习第一章 介绍 DirectX,(Direct eXtension,简称DX)是由微软公司创建的多媒体编程接口。由C+编程语言实现,遵循COM。被广泛使用于Microsoft Windows、Microsoft XBOX、Microsoft XBOX 360和Microsoft XBOX ONE电子游戏开发,并且只能支持这些平台。(来自XX百科) 所谓COM(Component Object Model,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。通过这种标准将可以在

2、任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。 DirectX的组成部分显示部分:DirectDraw:主要负责2D图像加速,比如播放mpg、DVD电影、看图、玩小游戏等。(9.0起,被集成到Direct3D中)Direct3D:主要负责3D效果的显示,比如3D游戏中的场景和人物声音部分:DirectSound:播放声音,处理混音,加强3d音效,提供录音,并解决声卡兼容的问题。输入部分:DirectInput:可以支持很多的游戏输入设备,比如键盘、鼠标、手柄、摇杆等。(除XInput外只更新到8.0, XInput 主要为XBOX

3、服务)网络部分:DirectPlay:为网游提供了多种连接方式,比如:TCP/IP,IPX,Modem,串口等。(不建议使用) 如果没有DirectX,每款游戏必须针对不同的显卡开发相应的接口,这是不可接受的。Why?从游戏开发的角度考虑:增加游戏的开发难度。延长游戏的开发周期。增加游戏的开发成本。从后期维护的角度考虑:每当有新的显卡上市,都必须为游戏开发相应的补丁或者升级,增加了维护成本。每当推出一款新游戏都必须针对所以显卡重新开发,代码重用率极低。 DirectX 1失败的一代:(代表游戏:Lego Island)失败原因:推出时众多的硬件均不支持强大的对手:专业图形APIOpenGL不包

4、括现在所有的3D功能特点:第一个可以直接对硬件信息进行读取的程序 DirectX 2较上一代有巨大改变:(代表游戏:暴力摩托)特点:采用了Direct 3D的技术采用平滑模拟和RGB模拟对3D图像进行加速计算 DirectX 3是DirectX 2的简单升级(代表游戏:红色警戒、Descent2)时代背景:三大接口标准:专业的OpenGL接口,微软的DirectX D接口和3DFX公司的Glide特点:集成了较简单的3D效果,还不是很成熟。 没有DirectX 4 DirectX 5:(代表游戏:红线赛车)特点加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加

5、入了S3的纹理压缩技术3D技术有较大提高 DirectX 6走向成熟:(代表游戏:毁灭巫师)特点:加入了双线性过滤、三线性过滤等优化3D图像质量的技术对手之一Glide走向没落 DirectX 7 DirectX的黄金时代:(代表游戏:星际争霸1、半条命:反恐精英)特点:支持T&L(坐标转换和光源)虽然OpenGL中已有相关技术,但此前从未在民用级硬件中出现 DirectX 8引领了一场显卡革命:(代表游戏:暗黑破坏神2、魔兽争霸3)特点:首次引入Pixel Shader(像素着色器)和Vertex Shader(顶点着色器),营造真实的水波效果,3D画质史无前例 DirectX 9 经典的一

6、代:(代表游戏:魔兽世界、生化危机4 PC版)特点:更高的渲染精度Shader Model 3.0标准 (DirectX 9.0C) DirectX 10 沦为过渡的一代:(代表游戏:孤岛危机、鬼泣4 PC版)特点:增加了几何着色器(Geometry Shader)VISTA的不成功拖累了DirectX10 DirectX 11 又一个经典:(代表游戏:极度恐慌3、刺客信条3)特点:Tessellation细分曲面技术,DirectCompute 11,ShaderModel 5.0,多线程渲染等(Tessellation的作用:使水和毛发变得生动) DirectX 12 刚刚诞生:(代表游戏

7、:奇点灰烬、使命召唤12)特点:微软的DX12最重要的变化就是带来了底层硬件优化,支持A、N显卡混搭 DirectX VS OpenGLOpenGL(Open Graphics Library),是一个开放的图形程序接口,定位为专业图形处理。 为什么要学DirectX:1.游戏产业发展迅速:截至2014年,游戏业市场收入规模超过1000亿元2.游戏人才缺口巨大:起薪8000,游戏行业人才缺口达60万。第二章 D3D基础知识 二维图像是通过在指定位置设置的虚拟摄像机可以观察到的三维世界中物体的影像 Direct3D体系结构:应用程序、Direct3D、GDI、DDI和硬件设备之间的层次关系 Di

8、rect3D是一个图形应用程序的底层接口(API),通过该接口可以直接使用硬件的3D加速性能来渲染三维场景,可以认为Direct3D是应用程序和硬件设备之间的一个中间媒介。 Direct3D不能直接和硬件设备打交道的原因:微型计算机拥有各种各样的显卡,每种显卡的能力都不一样,而且它们对相同功能的实现方式也不一样。 GDI:图形设备接口,MicroSoft开发的通用的windows系统图形编程接口,功能强涉及面广,一般的编程都用它。但是用来做多媒体开发就差强人意了 组件对象模型(COM):组件对象模型(Component Object Model,COM)使DirectX具有了语言无关性和向后兼

9、容性。 当使用C+编写DirectX的应用程序的时候,许多 COM组件方法和属性都可以直接调用。在COM技术中可以通过特殊的函数或者另一COM接口的方法获得指向某一COM接口的指针。创建COM接口时不能使用new,当完成某个接口的操作而需要释放它们的时候,需要用Release方法而不是用delete操作来完成释放。 多重采样:多重采样技术是指通过像素矩阵来描述图像时使图像更加平滑的技术。重采样技术常常用于屏幕抗锯齿操作。使用目标像素周围的一些点来生成该像素点的最终颜色。typedef struct DXGI_SAMPLE_DESC UINT Count; UINT Quality; DXGI_

10、SAMPLE_DESC, *LPDXGI_SAMPLE_DESC;Count表示计算每个像素点需要采样的个数,Quality用来确定最终效果的质量。不采用多重采样,只需要设置Count为1,Quality为0。 交换链和页面翻转:Direct3D维护着一组表面缓冲区,通常有两个或者三个,通常将这组表面缓冲区的组合叫作交换链。 交换链,更准确的说法是页面翻转技术,主要用途是在播放动画的时候使帧和帧间的交换变得更加流畅。渲染图形的代码结构变为:(1) 将显示数据渲染到后缓冲区。(2) 进行提交(Presenting)操作,交换前后缓冲区。(3) Goto(1) 深度缓冲区:深度缓冲区也是一个表面缓

11、冲区,但是在深度缓冲区中不是保存图片信息,而是保存着每个像素点对应的深度信息。 Direct3D中使用深度缓冲(也称为Z缓冲)技术来进行可见面的判断。深度缓冲区的大小格式决定了深度测试的准确性。比如,24位的深度缓冲区比16位的准确性高。常用的深度缓存数据格式:DXGI_FORMAT_D32_FLOAT_S8X24_UINT: 表示一个32位浮点深度缓存,8位提供给模版缓存,范围0,255,剩余24位用来占位。DXGI_FORMAT_D32_FLOAT: 表示一个32位浮点缓存。DXGI_FORMAT_D24_UNORM_S8_UINT: 表示一个32位缓存,24位无符号数提供给深度缓存,范围

12、0,1,8位无符号整数留给模版缓存,范围0,255。DXGI_FORMAT_D16_UNORM: 表示一个16位无符号深度缓存,范围0,1。 深度冲突(Z-Finghting or Depth Fighting):深度缓冲的分辨率对于场景质量有很大的影响:当两个物体非常接近的时候,16 位的深度缓冲区可能会导致“深度冲突” ;使用 24 位或者 32 位的深度缓冲区就会表现得较好;由于精度太低,所以很少使用 8 位的深度缓冲区。 模型的表示:一个场景是由物体或者模型所组成的。物体可以通过三角形网格进行近似的描述。网格中的三角形是物体的基本组成部分。可以通过指定三角形的三个顶点来描述三角形。描述

13、一个物体的时候,只需要指定构成物体的那些三角形单元列表。 顶点格式:在Direct3D中,顶点不只有单纯的空间信息,可以拥有颜色、法线向量 、纹理等属性,Direct3D中我们可以灵活的构造自己的顶点格式(自己定义顶点的成员)。创建一个自定义的顶点格式,首先需要创建顶点的结构。 三角形:三角形是构成三维模型的基本元素。为构建一个物体,需要创建三角形列表描述物体的形状和轮廓。三角形列表中包含了每个需要渲染的三角形的数据。例如,构建一个矩形,可以将矩形分成两个三角形,并且指定所有三角形的顶点虚拟摄像机: 摄像机可见的体积范围是一个平截头体,在3D中称为视域体,由视角范围、近平面和远平面来决定。 投

14、影窗口(Projection Window):是一个二维窗口,视域体中的三维几何体将投影到这个二维窗口上,从而生成一个代表三维世界的二维图像。我们使用min=(-1,-1)和max=(1,1)来定义投影窗口的大小。 近裁剪面和远裁剪面:在现实中,我们会发现,离眼睛太远的东西我们就看不到了,离眼睛太近的东西又会挡住大部分景色。于是就定义了近裁剪面(近平面)和远裁剪面(远平面)比近裁剪面还近的物体和比远裁剪面还远的物体,我们不把他们透视到投影窗口上。教材中为了简化绘制工作,将近裁剪面和投影平面(投影窗口所在的平面)合二为一。 三维空间及其变换:建立好3D场景的几何描述,设置好虚拟摄像机,需要将该场

15、景显示到2D显示器上。实现这一目标的一系列运算称为绘制流水线:绘制流水线中,如果要将几何物体从一个坐标系中变换到另一个坐标系中去。这些变换都通过矩阵来完成。 局部坐标系(模型空间):局部坐标系(Local space或者称为建模坐标系)指定义组成物体的三角形列表时所使用的坐标系统。局部坐标系可以简化建模过程。在模型的本地空间中创建模型比在世界空间中创建模型要简单些。例如,局部坐标系中创建物体时,不需要考虑物体的位置、大小以及与世界空间中其他物体的关系。补充:在现实开发中,较复杂的模型一般用3DMax等工具生成*.3ds文件,再由D3D提供的Conv3ds.exe工具转换成*.x文件,最后读入模

16、型。 世界坐标系(世界空间):世界坐标系是三维空间物体所在的坐标系,模型的顶点坐标就是基于这个坐标系来表达的。将局部坐标系的物体变换到世界坐标系(World space)需要进行的一系列变换,这被称为世界变换(World Transform)。包括:平移(Translation)、旋转(Rotation)以及缩放(Scaling)操作世界变换完成世界坐标系中所有物体位置,包括大小、方向,以及相互之间关系的设置。 观察坐标系(视角空间):世界空间建立起来后,我们不一定能看到模型,因为我们还没有“眼睛”。在观察坐标系(View space transform或称视图空间)里,我们可以建立我们在三维

17、空间中的眼睛:虚拟摄像机。我们就是通过这个虚拟的摄像机来观察世界空间中的模型的。所以观察坐标系也叫摄像机空间。 视图空间:在世界空间中,几何物体和摄像机都是相对于世界坐标系来定义的。 要建立虚拟摄像机,我们需要一个观察矩阵(视图坐标系变换矩阵),产生观察矩阵的函数是:XMFINLINE XMMATRIX XMMatrixLookAtLH( FXMVECTOR pEye, FXMVECTOR pAt, FXMVECTOR pUp);pEye:设置摄像机在世界坐标系的位置pAt:设置摄像机的观察点,就是摄像机对着一个地方pUp:设置摄像机的向“上”方向的向量,通常设Y轴正方向为上方向,即取值为(0

18、,1,0)例如:假设我们要把照相机放在点(5,3,-10),并且目标点为世界坐标系的中点(0,0,0),我们可以这样获得观察矩阵:XMVECTOR Eye = XMVectorSet(5.0f, 3.0f, -10.0f, 0.0f);/相机位置XMVECTOR At = XMVectorSet( 0.0f, 0.0f, 0.0f, 0.0f );/目标位置XMVECTOR Up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );/upXMMatrixLookAtLH (Eye, At, Up); 背面消隐:视图空间中的一个物体,组成物体的多边形的前表面都有一个箭

19、头。前表面面对着摄像机的多边形叫做正面(front side),前表面背向摄像机的表面叫做背向(back side)。背面消隐(backface culling背面剔除)后,从摄像机角度来看,渲染出来的还是相同的场景,因为在各种情况下都是看不见后表面的。默认情况下,按顺时针方向环绕的三角形(相对于观察者)是朝前的,而按逆时针方向环绕的三角形(相对于观察者)是朝后的。 光照:光源是在世界空间中定义的,但是经过视图空间变换后,光源就变换到观察坐标系中。在视图空间中,光源可以用来照亮场景中的物体,这样场景看起来就更加真实。 裁剪:剔除处于可视范围以外的物体,称为裁剪。一个三角形相对于表示可视范围的平

20、截台体可能具有3种不同的位置:完全在可视范围内;完全在可视范围外;部分在可视范围内(部分在可视范围外) 投影:在视图空间中,要使用二维的形式来描述三维场景,将n维变换为n-1维的过程被称为投影(projection)投影的方法有多种,但我们只对一种投影感兴趣,那就是透视投影(foreshortening)。因为透视投影可以使离照相机越远的物体投影到屏幕上后就越小(远小近大),这可以使我们把3D场景更真实的转化为2D图像投影变换定义了可见范围(视域体),并且负责把可视范围中的几何物体投影到投影窗口中。 在Direct3D中使用下面的函数,就可以根据视域体的描述参数创建一个投影矩阵:XMFINLI

21、NE XMMATRIX XMMatrixPerspectiveFovLH( FLOAT FovAngleY, / 用弧度表示的视野角度 FLOAT AspectRatio,/宽高比,用于矫正由方形投影窗口到矩形显示屏的映射发生的拉伸畸变 FLOAT NearZ, / 近裁剪面距离near FLOAT FarZ / 远裁剪面距离far) 视口变换:视口变换(Viewpoint transform)负责将物体从投影窗口坐标系变换到屏幕上的矩形区域,这个矩形就是视口。在Direct3D中,使用D3D11_VIEWPORT结构来描述视口,该结构的定义如下:typedef struct D3D11_VI

22、EWPORT FLOAT TopLeftX; /视口左上角的横坐标 FLOAT TopLeftY; /视口左上角的纵坐标 FLOAT Width; /视口的宽 FLOAT Height; /视口的高 FLOAT MinDepth; /最小深度缓冲值,0 FLOAT MaxDepth; /最大深度缓冲值,1 D3D11_VIEWPORT; 光栅化:在把顶点坐标变换为屏幕坐标后,我们就有了一个2D三角形单元列表。光栅化(Rasterization)是计算需要显示的每个三角形中每个像素的颜色值,最终结果是现实在屏幕上的一副2D图像。光栅化的本质是坐标变换、几何离散化 小结: 三维物体使用三角形网格进

23、行描述,三角形网格是一个三角形的列表,这些三角形组成一个与原来物体形状轮廓相似的三维图形。 虚拟摄像机的可视范围被设置为一个视域体,位于视域体内的场景就是摄像机能够观察的部分。 三维物体在本地局部坐标系中定义,在进行变换时,几何物体首先被变换到一个世界空间中,为了方便进行投影、裁剪以及其他操作,物体将被变换到视图空间中,视图空间中摄像机处于坐标系的原点,观察方向为Z轴的正方向。 最后,视口变换将几何物体从投影窗口变换到视口中,并通过光栅化,计算所有独立像素点的颜色值,得到一张描述三维世界的二维图片。第三章 必备的数学知识 Direct3D默认使用左手坐标系(Y轴在上) 几何学中向量用一个有向线

24、段来表示,其最重要的两个属性是:长度和方向 设有向量v=(v1, v2, v3), u=(u1, u2, u3)1、向量相等:如果 v1=u1, v2=u2, v3=u3,则 v=u2、向量长度(模):3、向量规范化: 4、向量点积: 5、向量叉积: XNA数学库是DirectX 11 SDK的一部分。为了使用XNA数学库,我们必须包含头文件xnamath.h。 XNA向量类型 XMVECTORXMVECTOR是向量表示的基础类型,它代表一个由4个float值组成的向量。XNA向量操作(*号可替换为2,3,4;叉乘只能换为2和3)BOOL XMVector*Equal(FXMVECTOR V1

25、, FXMVECTOR V2); /向量相等XMVECTOR XMVector*Dot(FXMVECTOR V1, FXMVECTOR V2); /向量点乘XMVECTOR XMVector*Cross(FXMVECTOR V1, FXMVECTOR V2);/向量叉乘XMVECTOR XMVector*Length(FXMVECTOR V); /向量求模XMVECTOR XMVector*Normalize(FXMVECTOR V); /规范化向量 对于向量的表示,XNA数学库中还提供了以下几种类型,它们都是对XMVECTOR类型进行了简单的封装并都提供了到XMVECTOR的类型转换:XMV

26、ECTORF32 /浮点数XMVECTORI32 /整型数XMVECTORU8 /字节XMVECTORU32 /无符号整型数它们分别以不同的类型操作XMVECTOR对象。 矩阵乘法的规则若有A和B两个矩阵,只有当A的列数和B的行数相等,乘积AB才有意义。AB BA,即矩阵乘法一般不具有交换性。(一些特殊矩阵除外) XNA矩阵类型:在XNA数学库中,使用XMMATRIX表示一个44的矩阵,此矩阵包含16个按16字节对齐的浮点数,它们可以映射到SIMD硬件寄存器(XMM0XMM7)。XNA矩阵操作:XMMATRIX XMMatrixIdentity(); /获得一个单位矩阵XMMATRIX XMM

27、atrixTranspose(CXMMATRIX M); /求转置矩阵XMMATRIX XMMatrixInverse(_Out_ XMVECTOR* pDeterminant, CXMMATRIX M); /求逆矩阵XMMATRIX XMMatrixMultiply(CXMMATRIX M1, CXMMATRIX M2);/矩阵相乘XMVECTOR XMVector4Transform(FXMVECTOR V,CXMMATRIX M);/向量矩阵相乘 通过对应的Load和Store函数可以方便地在这些类型和XMMATRIX类型之间进行转换。最好避免直接使用XMMATRIX作为类或结构体的数据

28、成员,而是用XMFLOAT*X*来存储矩阵 在XNA中使用下列函数设置一个平移转换矩阵:XMMATRIX XMMatrixTranslation (FLOAT OffsetX,FLOAT OffsetY,FLOAT OffsetZ); /三个参数分别表示在X, Y, Z轴上的平移量XMMATRIX XMMatrixTranslationFromVector (FXMVECTOR Offset);/参数为一个平移向量 XNA中常用的矩阵旋转函数: XMMATRIX XMMatrixRotationX(FLOAT Angle);/根据旋转角度创建绕x轴旋转的矩阵 XMMATRIX XMMatrix

29、RotationY(FLOAT Angle);/根据旋转角度创建绕y轴旋转的矩阵 XMMATRIX XMMatrixRotationZ(FLOAT Angle);/根据旋转角度创建绕z轴旋转的矩阵 XNA库中常用缩放矩阵函数: XMMATRIX XMMatrixScaling(FLOAT ScaleX,FLOAT ScaleY, FLOAT ScaleZ);/根据x/y/z轴的缩放系数创建缩放矩阵 XMMATRIX XMMatrixScalingFromVector(FXMVECTOR Scale);/根据缩放向量(描述了3个轴各自的缩放系数)创建缩放矩阵第六章 索引 如何绘制一个静止的无色立

30、方体?1个立方体=12个三角形。创建顶点缓存,会发现重复顶点会浪费额外空间,降低绘制效率。 索引缓存的思路:顶点缓存保存了物体模型所有的顶点数据,而这些数据可以是唯一的。索引缓存保存了构成物体的所需顶点在顶点缓存的索引值,通过索引查找对应的顶点,以完成图形的绘制。注意:索引缓存不能脱离顶点缓存独立存在。 索引缓存的创建方法:1、创建立方体的顶点数组:2、创建索引数组:3、创建顶点缓存:4、创建索引缓存第七章 光照的基础知识第九章 混合的基础知识 混合公式: 禁止颜色写入(实验九会用到):有时候,在渲染过程中,我们只希望修改深度/模板缓冲区部分,而且希望保持后缓冲区中的原有颜色值,这时修,我们需要“禁止颜色写入”。一种方法是把目标混合因子设为D3D11_BLEND_ONE,把源混合因子设为D3D11_BLEND_ZERO,这样混合方程中源部分相乘后结果为0,目标部分相乘后保持原样,相加结果仍为原来的颜色,这样即禁止了颜色的写入;还有另一种更为直观的方法是,直接把描述中D3D11_RENDER_TARGET_BLEND_DESC:RenderTargetWriteMask成员设为0,即任何一位都无法写入。 把颜色相加、相减:在处理片段时,如果我们希望把片段颜色与后缓冲区中当前颜色值相加。这时,可以通过把源、目标混合因子全部设为D3D11_BLEND_ONE

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1