资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,概述:,像素、分辨率、顶点,在,D3D,中的颜色,页翻动和交换链,D3D,内存池,重点:,难点:,颜色的表示方法,D3D,中的颜色,第,005,课,Direct3D,基础,1,2.1 Direct3D,中的基础概念,2.1.1,像素,(Pixel),和分辨率,(Resolution),像素是指,:,图像在屏幕上显示的最小单元,即屏幕上的一个亮点。它也指在,frame buffer,(颜色缓冲区)中的最小图形单元。,分辨率是指,:,显示设备所能显示的最大像素个数。例如:一个分辨率为,1024768,的显示屏能够显示水平方向,1024,个像素,垂直方向,768,个像素,满屏显示,1024768,786432,个像素。,第,005,课,Direct3D,基础,2,2.1 Direct3D,中的基础概念,2.1.2,顶点,(Vertices),第,005,课,Direct3D,基础,顶点就是,3D,空间中的一个点,它定义了多边形的相交点。,Direct3D,中能够渲染的所有物体都是由图元构成,而图元都是由顶点构成。,3,在,D3D,中,像素和顶点的颜色使用,RGB,表示。也就是说,我们规定,Red,,,Green,,,Blue,这三种颜色的量,以此确定最终的颜色。通过使用这种方法,我们可以表示成千上万种颜色。,2.1.3 D3D,中的颜色,2.1 Direct3D,中的基础概念,第,005,课,Direct3D,基础,我们使用两种不同类型的结构来保存,RGB,数据:,D3DCOLOR,D3DCOLORVALUE,4,D3DCOLOR,是一个,32,位的,DWORD,类型的数。,32,位被分为,4,个部分,每部分保存一种颜色组件的大小。,Red,,,Green,,,Blue,各,8,位,另一个字节被分配给,Alpha,通道。,每种颜色组件占一个字节的空间,所以颜色值为,0,255,。,0,表示没有该种颜色,,255,表示该颜色组件的最高强度。,2.1.3.1,D3DCOLOR,2.1 Direct3D,中的基础概念,2.1.3 D3D,中的颜色,第,005,课,Direct3D,基础,5,为,D3DCOLOR,数据类型指定数值比较麻烦,所以我们可以使用一个宏,D3DCOLOR_ARGB,,为,D3DCOLOR,进行赋值。,D3DCOLOR_ARGB,需要,3,个颜色参数和,1,个,alpha,参数。例如:,D3DCOLOR brightRed=D3DCOLOR_ARGB(255,255,0,0);,D3DCOLOR someColor=D3DCOLOR_ARGB(255,144,87,201);,1.D3DCOLOR_ARGB,宏,2.1.3.1,D3DCOLOR,2.1 Direct3D,中的基础概念,2.1.3 D3D,中的颜色,第,005,课,Direct3D,基础,6,我们还可以使用另外一个宏,D3DCOLOR_XRGB,,对,D3DCOLOR,进行设置。,D3DCOLOR_XRGB,会将,alpha,值设为,0 xff,(,255,):,#define D3DCOLOR_XRGB(r,g,b)D3DCOLOR_ARGB(0 xff,r,g,b),2.,D3DCOLOR_XRGB,宏,2.1.3.1,D3DCOLOR,2.1 Direct3D,中的基础概念,2.1.3 D3D,中的颜色,第,005,课,Direct3D,基础,7,D3DCOLORVALUE,结构通过浮点值表示每一种颜色组件的强度。取值范围为从,0,到,1,。,0,表示没有该颜色组件,,1,表示该颜色组件的最高强度。,typedef struct _D3DCOLORVALUE,float r;/Red,组件,范围,0.0-1.0,float g;/Green,组件,范围,0.0-1.0,float b;/Blue,组件,范围,0.0-1.0,float a;/alpha,组件,范围,0.0-1.0,D3DCOLORVALUE;,2.1.3.2,D3DCOLORVALUE,2.1 Direct3D,中的基础概念,2.1.3 D3D,中的颜色,第,005,课,Direct3D,基础,8,D3DXCOLOR,结构与,D3DCOLORVALUE,包含同样的数据成员,但是提供了有用的构造函数与重载运算符,使颜色操纵更加方便。由于两种结构数据成员相同,我们可以在两种结构间相互转化。,typedef struct D3DXCOLOR/,具体定义请参见,DirectX SDK,#ifdef _cplusplus,public:,FLOAT r,g,b,a;,D3DXCOLOR,*LPD3DXCOLOR;,2.1.3.2,D3DCOLORVALUE,2.1 Direct3D,中的基础概念,2.1.3 D3D,中的颜色,1.D3DXCOLOR,结构,第,005,课,Direct3D,基础,9,由于,D3DCOLORVALUE,和,D3DXCOLOR,都有四个浮点数组件,所以可以将颜色作为一种,4,维向量,(r,g,b,a),。颜色向量可以和普通向量一样进行相加减,进行缩放。点乘和叉乘对颜色向量没有意义,但是组件之间乘法是有意义的。所以在,D3DCOLOR,类中有“颜色,颜色”相乘的操作符。,2.,颜色向量,2.1.3.2,D3DCOLORVALUE,2.1 Direct3D,中的基础概念,2.1.3 D3D,中的颜色,第,005,课,Direct3D,基础,10,图元的颜色取决于构成图元的三角形的颜色。因此我们必须在我们的顶点数据结构中加入颜色成员。,注意不能将,D3DCOLORVALUE,类型的数据作为顶点颜色成员,因为,D3D,要求用,32,位的值来描述顶点颜色。,2.1.3.3,顶点颜色,2.1 Direct3D,中的基础概念,2.1.3 D3D,中的颜色,第,005,课,Direct3D,基础,11,D3D,维护着几个表面,通常由两个或三个表面组成一个交换链(,swap chain,),由,IDirect3DSwapChain9,接口表示。我们很少需要手动的操纵它,因为,D3D,将自动进行管理。所以我们只需了解它的用途。,交换链和页翻动(,page flipping,)技术被用于提供帧之间的平滑动画。,2.1 Direct3D,中的基础概念,2.1.4,页翻动与交换链,第,005,课,Direct3D,基础,12,第,005,课,Direct3D,基础,2.1 Direct3D,中的基础概念,2.1.4,页翻动与交换链,2.1.4.1,颜色缓冲区,颜色缓冲区,(FrameBuffer),是位于系统内存或显存里的一块内存块,对应于将要显示的一块二维显示区域(即表面)。,前台缓冲区,(Front Buffer),和后台缓冲区,(Back Buffer),都是颜色缓冲区的一种,前台缓冲区主要用于屏幕刷新,也是我们可见的部分。后台缓冲区主要用于图形的绘制,绘制完成后,两者进行页翻动的工作,把处理完的图形显示出来。,13,第,005,课,Direct3D,基础,2.1 Direct3D,中的基础概念,2.1.4,页翻动与交换链,2.1.4.2,前台缓冲区和后台缓冲区,前台缓冲区:,前台缓冲区保存着当前监视器所展示的图形。监视器不会立即显示在前台缓冲区中的图像。而是每隔一段时间,比如,1/60,秒刷新一次,该时间取决于屏幕刷新率。,14,第,005,课,Direct3D,基础,2.1 Direct3D,中的基础概念,2.1.4,页翻动与交换链,2.1.4.2,前台缓冲区和后台缓冲区,后台缓冲区:,应用程序的帧刷新率一般来说要快于屏幕刷新率。然而在监视器完成当前帧的描绘之前,我们不能用下一帧的动画来更新前台缓冲区的内容。但是与此同时,我们也不希望等待监视器描绘完成当前前台缓冲区的内容之后,再来更新其中的内容。因此我们需要引入一个离屏表面(即后台缓冲区)。,15,图中交换链由两个表面组成:前台缓冲区和后台缓冲区,2.1 Direct3D,中的基础概念,2.1.4,页翻动与交换链,2.1.4.2,前台缓冲区和后台缓冲区,第,005,课,Direct3D,基础,16,我们将在一个离屏表面(即后台缓冲区)中进行描绘,当监视器描绘完毕前台缓冲区中的内容后,我们将该前台缓存区换到交换链的后面,而交换链中后面的后台缓冲区变为前台缓冲区。这个过程称为,Present,(显示)。,2.1 Direct3D,中的基础概念,2.1.4,页翻动与交换链,2.1.4.3,显示,(Present),第,005,课,Direct3D,基础,17,在右图中进行了两次,present,。当使用有两个表面的交换链时,可以看到,present,的次数就是交换表面的次数。,1.,渲染后台缓冲区;,2.,显示后台缓冲区;,3.,重新循环到,1,。,2.1 Direct3D,中的基础概念,2.1.4,页翻动与交换链,2.1.4.4,渲染过程,第,005,课,Direct3D,基础,18,2.1.5,内存池,(Memory Pools),2.1 Direct3D,中的基础概念,一些,D3D,资源能够放在不同种类的内存池中。内存池由,D3DPOOL,枚举变量进行定义。可用的内存池主要有:,D3DPOOL_DEFAULT,D3DPOOL_MANAGED,D3DPOOL_SYSTEMMEM,D3DPOOL_SCRATCH,第,005,课,Direct3D,基础,19,D3DPOOL_DEFAULT:,这是,D3D,的默认内存池。依据资源类型和用途的不同,它可以事显存、,AGP,内存、或系统内存。注意在默认内存池中的资源必须在,IDirect3DDevice9:Reset,调用前销毁(或释放)掉,而在,Reset,调用之后重新初始化。,D3DPOOL_MANAGED:,在其中的资源由,D3D,进行管理。它们根据设备的需要,被移入到,AGP,内存或显存中。另外,在系统内存中将维护一份资源的拷贝。当应用程序访问或修改资源时,它们将使用系统拷贝。随后,,D3D,根据需要自动更新显存中的内容。,2.1.5,内存池,(Memory Pools),2.1 Direct3D,中的基础概念,第,005,课,Direct3D,基础,20,D3DPOOL_SYSTEMMEM:,资源被放入系统内存中。,D3DPOOL_SCRATCH:,资源被放入到系统内存中。与,D3DPOOL_SYSTEMMEM,之处在于这些资源不接受图像设备的限制。其结果就是,设备不能访问在该池中的资源。,但是这些资源可以与其它内存池进行交换。,2.1.5,内存池,(Memory Pools),2.1 Direct3D,中的基础概念,第,005,课,Direct3D,基础,21,小结:,像素、分辨率、顶点,D3D,中的颜色,页翻动和交换链,内存池,第,005,课,Direct3D,基础,22,小测验:,1,、,D3D,中只需要一块颜色缓冲区。(),2,、顶点颜色必须为,32,位的数,所以不能够使用,D3DCOLORVALUE,类型的数据。(),3,、颜色向量的点乘、叉乘没有意义。(),4,、应用程序进行渲染的缓冲区是:(),A.,前台缓冲区,B.,后台缓冲区,5,、由,D3D,设备进行资源管理的,D3D,的内存池是:,(),D3DPOOL_DEFAULT,B.D3DPOOL_MANAGED,C.D3DPOOL_SYSTEMMEM,D.D3DPOOL_SCRATCH,第,005,课,Direct3D,基础,23,小测验:(答案),1,、,D3D,中只需要一块颜色缓冲区。(,F,),2,、顶点颜色必须为,32,位的数,所以不能够使用,D3DCOLORVALUE,类型的数据。(,T,),3,、颜色向量的点乘、叉乘没有意义。(,T,),4,、应用程序进行渲染的缓冲区是:(,B,),A.,前台缓冲区,B.,后台缓冲区,5,、由,D3D,设备进行资源管理的,D3D,的内存池是:,(,B,),D3DPOOL_DEFAULT,B.D3DPOOL_MANAGED,C.D3DPOOL_SYSTEMMEM,D.D3DPOOL_SCRATCH,第,005,课,Direct3D,基础,24,课后作业:,1,、根据,D3DCOLOR,的定义,自己实现一个,D3DCOLOR_ARGB,宏和,D3DCOLOR_XRGB,宏。,2,、结合有关动画和二维游戏的制作,理解页翻动和交换链的意义。,第,005,课,Direct3D,基础,25,
展开阅读全文