重庆大学DirectX复习资料.docx
《重庆大学DirectX复习资料.docx》由会员分享,可在线阅读,更多相关《重庆大学DirectX复习资料.docx(24页珍藏版)》请在冰豆网上搜索。
重庆大学DirectX复习资料
DirectX复习
第一章介绍
●DirectX,(DirecteXtension,简称DX)是由微软公司创建的多媒体编程接口。
由C++编程语言实现,遵循COM。
被广泛使用于MicrosoftWindows、MicrosoftXBOX、MicrosoftXBOX360和MicrosoftXBOXONE电子游戏开发,并且只能支持这些平台。
(来自XX百科)
●所谓COM(ComponentObjectModel,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。
通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。
●DirectX的组成部分
显示部分:
DirectDraw:
主要负责2D图像加速,比如播放mpg、DVD电影、看图、玩小游戏等。
(9.0起,被集成到Direct3D中)
Direct3D:
主要负责3D效果的显示,比如3D游戏中的场景和人物
声音部分:
DirectSound:
播放声音,处理混音,加强3d音效,提供录音,并解决声卡兼容的问题。
输入部分:
DirectInput:
可以支持很多的游戏输入设备,比如键盘、鼠标、手柄、摇杆等。
(除XInput外只更新到8.0,XInput主要为XBOX服务)
网络部分:
DirectPlay:
为网游提供了多种连接方式,比如:
TCP/IP,IPX,Modem,串口等。
(不建议使用)
●如果没有DirectX,每款游戏必须针对不同的显卡开发相应的接口,这是不可接受的。
Why?
从游戏开发的角度考虑:
增加游戏的开发难度。
延长游戏的开发周期。
增加游戏的开发成本。
从后期维护的角度考虑:
每当有新的显卡上市,都必须为游戏开发相应的补丁或者升级,增加了维护成本。
每当推出一款新游戏都必须针对所以显卡重新开发,代码重用率极低。
●DirectX1失败的一代:
(代表游戏:
LegoIsland)
失败原因:
推出时众多的硬件均不支持
强大的对手:
专业图形API-OpenGL
不包括现在所有的3D功能
特点:
第一个可以直接对硬件信息进行读取的程序
●DirectX2较上一代有巨大改变:
(代表游戏:
暴力摩托)
特点:
采用了Direct3D的技术
采用平滑模拟和RGB模拟对3D图像进行加速计算
●DirectX3是DirectX2的简单升级(代表游戏:
红色警戒、Descent2)
时代背景:
三大接口标准:
专业的OpenGL接口,微软的DirectXD接口和3DFX公司的Glide
特点:
集成了较简单的3D效果,还不是很成熟。
●没有DirectX4
●DirectX5:
(代表游戏:
红线赛车)
特点
加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加入了S3的纹理压缩技术
3D技术有较大提高
●DirectX6走向成熟:
(代表游戏:
毁灭巫师)
特点:
加入了双线性过滤、三线性过滤等优化3D图像质量的技术
对手之一Glide走向没落
●DirectX7DirectX的黄金时代:
(代表游戏:
星际争霸1、半条命:
反恐精英)
特点:
支持T&L(坐标转换和光源)
虽然OpenGL中已有相关技术,但此前从未在民用级硬件中出现
●DirectX8引领了一场显卡革命:
(代表游戏:
暗黑破坏神2、魔兽争霸3)
特点:
首次引入PixelShader(像素着色器)和VertexShader(顶点着色器),营造真实的水波效果,3D画质史无前例
●DirectX9经典的一代:
(代表游戏:
魔兽世界、生化危机4PC版)
特点:
更高的渲染精度
ShaderModel3.0标准(DirectX9.0C)
●DirectX10沦为过渡的一代:
(代表游戏:
孤岛危机、鬼泣4PC版)
特点:
增加了几何着色器(GeometryShader)
VISTA的不成功拖累了DirectX10
●DirectX11又一个经典:
(代表游戏:
极度恐慌3、刺客信条3)
特点:
Tessellation细分曲面技术,DirectCompute11,ShaderModel5.0,多线程渲染等(Tessellation的作用:
使水和毛发变得生动)
●DirectX12刚刚诞生:
(代表游戏:
奇点灰烬、使命召唤12)
特点:
微软的DX12最重要的变化就是带来了底层硬件优化,支持A、N显卡混搭
●DirectXVSOpenGL
OpenGL(OpenGraphicsLibrary),是一个开放的图形程序接口,定位为专业图形处理。
●为什么要学DirectX:
1.游戏产业发展迅速:
截至2014年,游戏业市场收入规模超过1000亿元
2.游戏人才缺口巨大:
起薪8000,游戏行业人才缺口达60万。
第二章D3D基础知识
●二维图像是通过在指定位置设置的虚拟摄像机可以观察到的三维世界中物体的影像
●Direct3D体系结构:
应用程序、Direct3D、GDI、DDI和硬件设备之间的层次关系
●Direct3D是一个图形应用程序的底层接口(API),通过该接口可以直接使用硬件的3D加速性能来渲染三维场景,可以认为Direct3D是应用程序和硬件设备之间的一个中间媒介。
●Direct3D不能直接和硬件设备打交道的原因:
微型计算机拥有各种各样的显卡,每种显卡的能力都不一样,而且它们对相同功能的实现方式也不一样。
●GDI:
图形设备接口,MicroSoft开发的通用的windows系统图形编程接口,功能强涉及面广,一般的编程都用它。
但是用来做多媒体开发就差强人意了
●组件对象模型(COM):
组件对象模型(ComponentObjectModel,COM)使DirectX具有了语言无关性和向后兼容性。
当使用C++编写DirectX的应用程序的时候,许多COM组件方法和属性都可以直接调用。
在COM技术中可以通过特殊的函数或者另一COM接口的方法获得指向某一COM接口的指针。
创建COM接口时不能使用new,当完成某个接口的操作而需要释放它们的时候,需要用Release方法而不是用delete操作来完成释放。
●多重采样:
多重采样技术是指通过像素矩阵来描述图像时使图像更加平滑的技术。
重采样技术常常用于屏幕抗锯齿操作。
使用目标像素周围的一些点来生成该像素点的最终颜色。
typedefstructDXGI_SAMPLE_DESC{
UINTCount;
UINTQuality;}
DXGI_SAMPLE_DESC,*LPDXGI_SAMPLE_DESC;
Count表示计算每个像素点需要采样的个数,Quality用来确定最终效果的质量。
不采用多重采样,只需要设置Count为1,Quality为0。
●交换链和页面翻转:
Direct3D维护着一组表面缓冲区,通常有两个或者三个,通常将这组表面缓冲区的组合叫作交换链。
交换链,更准确的说法是页面翻转技术,主要用途是在播放动画的时候使帧和帧间的交换变得更加流畅。
渲染图形的代码结构变为:
(1)将显示数据渲染到后缓冲区。
(2)进行提交(Presenting)操作,交换前后缓冲区。
(3)Goto
(1)
●深度缓冲区:
深度缓冲区也是一个表面缓冲区,但是在深度缓冲区中不是保存图片信息,而是保存着每个像素点对应的深度信息。
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位无符号数提供给深度缓存,范围[0,1],8位无符号整数留给模版缓存,范围[0,255]。
DXGI_FORMAT_D16_UNORM:
表示一个16位无符号深度缓存,范围[0,1]。
●深度冲突(Z-FinghtingorDepthFighting):
深度缓冲的分辨率对于场景质量有很大的影响:
当两个物体非常接近的时候,16位的深度缓冲区可能会导致“深度冲突”;使用24位或者32位的深度缓冲区就会表现得较好;由于精度太低,所以很少使用8位的深度缓冲区。
●模型的表示:
一个场景是由物体或者模型所组成的。
物体可以通过三角形网格进行近似的描述。
网格中的三角形是物体的基本组成部分。
可以通过指定三角形的三个顶点来描述三角形。
描述一个物体的时候,只需要指定构成物体的那些三角形单元列表。
●顶点格式:
在Direct3D中,顶点不只有单纯的空间信息,可以拥有颜色、法线向量、纹理等属性,Direct3D中我们可以灵活的构造自己的顶点格式(自己定义顶点的成员)。
创建一个自定义的顶点格式,首先需要创建顶点的结构。
●三角形:
三角形是构成三维模型的基本元素。
为构建一个物体,需要创建三角形列表描述物体的形状和轮廓。
三角形列表中包含了每个需要渲染的三角形的数据。
例如,构建一个矩形,可以将矩形分成两个三角形,并且指定所有三角形的顶点
●虚拟摄像机:
摄像机可见的体积范围是一个平截头体,在3D中称为视域体,由视角范围、近平面和远平面来决定。
●投影窗口(ProjectionWindow):
是一个二维窗口,视域体中的三维几何体将投影到这个二维窗口上,从而生成一个代表三维世界的二维图像。
我们使用min=(-1,-1)和max=(1,1)来定义投影窗口的大小。
●近裁剪面和远裁剪面:
在现实中,我们会发现,离眼睛太远的东西我们就看不到了,离眼睛太近的东西又会挡住大部分景色。
于是就定义了近裁剪面(近平面)和远裁剪面(远平面)——比近裁剪面还近的物体和比远裁剪面还远的物体,我们不把他们透视到投影窗口上。
教材中为了简化绘制工作,将近裁剪面和投影平面(投影窗口所在的平面)合二为一。
●三维空间及其变换:
建立好3D场景的几何描述,设置好虚拟摄像机,需要将该场景显示到2D显示器上。
实现这一目标的一系列运算称为绘制流水线:
绘制流水线中,如果要将几何物体从一个坐标系中变换到另一个坐标系中去。
这些变换都通过矩阵来完成。
●局部坐标系(模型空间):
局部坐标系(Localspace或者称为建模坐标系)指定义组成物体的三角形列表时所使用的坐标系统。
局部坐标系可以简化建模过程。
在模型的本地空间中创建模型比在世界空间中创建模型要简单些。
例如,局部坐标系中创建物体时,不需要考虑物体的位置、大小以及与世界空间中其他物体的关系。
补充:
在现实开发中,较复杂的模型一般用3DMax等工具生成*.3ds文件,再由D3D提供的Conv3ds.exe工具转换成*.x文件,最后读入模型。
●世界坐标系(世界空间):
世界坐标系是三维空间物体所在的坐标系,模型的顶点坐标就是基于这个坐标系来表达的。
将局部坐标系的物体变换到世界坐标系(Worldspace)需要进行的一系列变换,这被称为世界变换(WorldTransform)。
包括:
平移(Translation)、旋转(Rotation)以及缩放(Scaling)操作世界变换完成世界坐标系中所有物体位置,包括大小、方向,以及相互之间关系的设置。
●观察坐标系(视角空间):
世界空间建立起来后,我们不一定能看到模型,因为我们还没有“眼睛”。
在观察坐标系(Viewspacetransform或称视图空间)里,我们可以建立我们在三维空间中的眼睛:
虚拟摄像机。
我们就是通过这个虚拟的摄像机来观察世界空间中的模型的。
所以观察坐标系也叫摄像机空间。
●视图空间:
在世界空间中,几何物体和摄像机都是相对于世界坐标系来定义的。
●要建立虚拟摄像机,我们需要一个观察矩阵(视图坐标系变换矩阵),产生观察矩阵的函数是:
XMFINLINEXMMATRIXXMMatrixLookAtLH(
FXMVECTORpEye,
FXMVECTORpAt,
FXMVECTORpUp
);
pEye:
设置摄像机在世界坐标系的位置
pAt:
设置摄像机的观察点,就是摄像机对着一个地方
pUp:
设置摄像机的向“上”方向的向量,通常设Y轴正方向为上方向,即取值为(0,1,0)
例如:
假设我们要把照相机放在点(5,3,-10),并且目标点为世界坐标系的中点(0,0,0),我们可以这样获得观察矩阵:
XMVECTOREye=XMVectorSet(5.0f,3.0f,-10.0f,0.0f);//相机位置
XMVECTORAt=XMVectorSet(0.0f,0.0f,0.0f,0.0f);//目标位置
XMVECTORUp=XMVectorSet(0.0f,1.0f,0.0f,0.0f);//up
XMMatrixLookAtLH(Eye,At,Up);
●背面消隐:
视图空间中的一个物体,组成物体的多边形的前表面都有一个箭头。
前表面面对着摄像机的多边形叫做正面(frontside),前表面背向摄像机的表面叫做背向(backside)。
背面消隐(backfaceculling背面剔除)后,从摄像机角度来看,渲染出来的还是相同的场景,因为在各种情况下都是看不见后表面的。
默认情况下,按顺时针方向环绕的三角形(相对于观察者)是朝前的,而按逆时针方向环绕的三角形(相对于观察者)是朝后的。
●光照:
光源是在世界空间中定义的,但是经过视图空间变换后,光源就变换到观察坐标系中。
在视图空间中,光源可以用来照亮场景中的物体,这样场景看起来就更加真实。
●裁剪:
剔除处于可视范围以外的物体,称为裁剪。
一个三角形相对于表示可视范围的平截台体可能具有3种不同的位置:
完全在可视范围内;完全在可视范围外;部分在可视范围内(部分在可视范围外)
●投影:
在视图空间中,要使用二维的形式来描述三维场景,将n维变换为n-1维的过程被称为投影(projection)
投影的方法有多种,但我们只对一种投影感兴趣,那就是透视投影(foreshortening)。
因为透视投影可以使离照相机越远的物体投影到屏幕上后就越小(远小近大),这可以使我们把3D场景更真实的转化为2D图像
投影变换定义了可见范围(视域体),并且负责把可视范围中的几何物体投影到投影窗口中。
在Direct3D中使用下面的函数,就可以根据视域体的描述参数创建一个投影矩阵:
XMFINLINEXMMATRIXXMMatrixPerspectiveFovLH
(
FLOATFovAngleY,//用弧度表示的视野角度
FLOATAspectRatio,//宽高比,用于矫正由方形投影窗口到矩形显示屏的映射发生的拉伸畸变
FLOATNearZ,//近裁剪面距离near
FLOATFarZ//远裁剪面距离far
)
●视口变换:
视口变换(Viewpointtransform)负责将物体从投影窗口坐标系变换到屏幕上的矩形区域,这个矩形就是视口。
在Direct3D中,使用D3D11_VIEWPORT结构来描述视口,该结构的定义如下:
typedefstructD3D11_VIEWPORT
{
FLOATTopLeftX;//视口左上角的横坐标
FLOATTopLeftY;//视口左上角的纵坐标
FLOATWidth;//视口的宽
FLOATHeight;//视口的高
FLOATMinDepth;//最小深度缓冲值,0
FLOATMaxDepth;//最大深度缓冲值,1
}D3D11_VIEWPORT;
●光栅化:
在把顶点坐标变换为屏幕坐标后,我们就有了一个2D三角形单元列表。
光栅化(Rasterization)是计算需要显示的每个三角形中每个像素的颜色值,最终结果是现实在屏幕上的一副2D图像。
光栅化的本质是坐标变换、几何离散化
●小结:
●三维物体使用三角形网格进行描述,三角形网格是一个三角形的列表,这些三角形组成一个与原来物体形状轮廓相似的三维图形。
●虚拟摄像机的可视范围被设置为一个视域体,位于视域体内的场景就是摄像机能够观察的部分。
●三维物体在本地局部坐标系中定义,在进行变换时,几何物体首先被变换到一个世界空间中,为了方便进行投影、裁剪以及其他操作,物体将被变换到视图空间中,视图空间中摄像机处于坐标系的原点,观察方向为Z轴的正方向。
●最后,视口变换将几何物体从投影窗口变换到视口中,并通过光栅化,计算所有独立像素点的颜色值,得到一张描述三维世界的二维图片。
第三章必备的数学知识
●Direct3D默认使用左手坐标系(Y轴在上)
●几何学中向量用一个有向线段来表示,其最重要的两个属性是:
长度和方向
●设有向量v=(v1,v2,v3),u=(u1,u2,u3)
1、向量相等:
如果v1=u1,v2=u2,v3=u3,则v=u
2、向量长度(模):
3、向量规范化:
4、向量点积:
5、向量叉积:
●XNA数学库是DirectX11SDK的一部分。
为了使用XNA数学库,我们必须包含头文件xnamath.h。
●XNA向量类型—XMVECTOR
XMVECTOR是向量表示的基础类型,它代表一个由4个float值组成的向量。
XNA向量操作(*号可替换为2,3,4;叉乘只能换为2和3)
BOOLXMVector*Equal(FXMVECTORV1,FXMVECTORV2);//向量相等
XMVECTORXMVector*Dot(FXMVECTORV1,FXMVECTORV2);//向量点乘
XMVECTORXMVector*Cross(FXMVECTORV1,FXMVECTORV2);//向量叉乘
XMVECTORXMVector*Length(FXMVECTORV);//向量求模
XMVECTORXMVector*Normalize(FXMVECTORV);//规范化向量
●对于向量的表示,XNA数学库中还提供了以下几种类型,它们都是对XMVECTOR类型进行了简单的封装并都提供了到XMVECTOR的类型转换:
XMVECTORF32//浮点数
XMVECTORI32//整型数
XMVECTORU8//字节
XMVECTORU32//无符号整型数
它们分别以不同的类型操作XMVECTOR对象。
●矩阵乘法的规则
若有A和B两个矩阵,只有当A的列数和B的行数相等,乘积AB才有意义。
AB≠BA,即矩阵乘法一般不具有交换性。
(一些特殊矩阵除外)
●XNA矩阵类型:
在XNA数学库中,使用XMMATRIX表示一个4×4的矩阵,此矩阵包含16个按16字节对齐的浮点数,它们可以映射到SIMD硬件寄存器(XMM[0]~XMM[7])。
XNA矩阵操作:
XMMATRIXXMMatrixIdentity();//获得一个单位矩阵
XMMATRIXXMMatrixTranspose(CXMMATRIXM);//求转置矩阵
XMMATRIXXMMatrixInverse(_Out_XMVECTOR*pDeterminant,CXMMATRIXM);//求逆矩阵
XMMATRIXXMMatrixMultiply(CXMMATRIXM1,CXMMATRIXM2);//矩阵相乘
XMVECTORXMVector4Transform(FXMVECTORV,CXMMATRIXM);//向量矩阵相乘
●通过对应的Load和Store函数可以方便地在这些类型和XMMATRIX类型之间进行转换。
最好避免直接使用XMMATRIX作为类或结构体的数据成员,而是用XMFLOAT*X*来存储矩阵
●在XNA中使用下列函数设置一个平移转换矩阵:
XMMATRIXXMMatrixTranslation(FLOATOffsetX,FLOATOffsetY,FLOATOffsetZ);//三个参数分别表示在X,Y,Z轴上的平移量
XMMATRIXXMMatrixTranslationFromVector(FXMVECTOROffset);//参数为一个平移向量
●XNA中常用的矩阵旋转函数:
XMMATRIXXMMatrixRotationX(FLOATAngle);//根据旋转角度创建绕x轴旋转的矩阵
XMMATRIXXMMatrixRotationY(FLOATAngle);//根据旋转角度创建绕y轴旋转的矩阵
XMMATRIXXMMatrixRotationZ(FLOATAngle);//根据旋转角度创建绕z轴旋转的矩阵
●XNA库中常用缩放矩阵函数:
XMMATRIXXMMatrixScaling(FLOATScaleX,FLOATScaleY,FLOATScaleZ);//根据x/y/z轴的缩放系数创建缩放矩阵
XMMATRIXXMMatrixScalingFromVector(FXMVECTORScale);//根据缩放向量(描述了3个轴各自的缩放系数)创建缩放矩阵
第六章索引
●如何绘制一个静止的无色立方体?
1个立方体=12个三角形。
创建顶点缓存,会发现重复顶点会浪费额外空间,降低绘制效率。
●索引缓存的思路:
顶点缓存保存了物体模型所有的顶点数据,而这些数据可以是唯一的。
索引缓存保存了构成物体的所需顶点在顶点缓存的索引值,通过索引查找对应的顶点,以完成图形的绘制。
注意:
索引缓存不能脱离顶点缓存独立存在。
●索引缓存的创建方法:
1、创建立方体的顶点数组:
2、创建索引数组:
3、创建顶点缓存:
4、创建索引缓存
第七章光照的基础知识
第九章混合的基础知识
●混合公式:
●禁止颜色写入(实验九会用到):
有时候,在渲染过程中,我们只希望修改深度/模板缓冲区部分,而且希望保持后缓冲区中的原有颜色值,这时修,我们需要“禁止颜色写入”。
一种方法是把目标混合因子设为D3D11_BLEND_ONE,把源混合因子设为D3D11_BLEND_ZERO,这样混合方程中源部分相乘后结果为0,目标部分相乘后保持原样,相加结果仍为原来的颜色,这样即禁止了颜色的写入;还有另一种更为直观的方法是,直接把描述中D3D11_RENDER_TARGET_BLEND_DESC:
:
RenderTargetWriteMask成员设为0,即任何一位都无法写入。
●把颜色相加、相减:
在处理片段时,如果我们希望把片段颜色与后缓冲区中当前颜色值相加。
这时,可以通过把源、目标混合因子全部设为D3D11_BLEND_ONE