Direct3D 是一种低层图形API ,它能让我们利用3D 硬件加速来渲染3D 世界。我们可以把Direct3D 看作是应用程序和图形设备之间的中介。

如图显示了应用程序、Direct3D 和图形设备之间的关系。

 

由图可以看出在Direct3DGraphics Device有一中介HAL(硬件抽象层,Hard Abstract layer)。由于市面上的显卡种类很多,而其在运作过程中处理事件的方式可能会有所不同,但是对于一名程序员而言,若是需要根据不同的硬件来采取不同的方式来编程,我想会有一部分人去选择跳楼了(至少我会),HAL也因此而应运而生——只需要同一套接口,至于具体与硬件的交互过程,我们则可以不必太细的去考虑了。

REF设备

对于一些硬件无法实现的API,可以通过它可以软件模拟出与API相同的功能。

D3DDEVTYPE

创建设备时指定设备类型。D3DDEVTYPE_HAL定义HAL设备),D3DDEVTYPE_REF(定义REF设备)。

COM

组件对象模型(COM, Component Object Model)是一种能使DirectX独立于编程语言和具有向下兼容性的技术

基础准备

表面

表面是一个像素点阵,在Direct3D中主要用来存储2D图形数据。如图:

 

        Direct3D基础_第1张图片

其中Pitch有可能比Width大且依赖于底层硬件。故不能单纯的认为Pitch = Width * sizeof(pixelFormat)

全屏抗锯齿

由于使用像素矩阵来表示图像,在显示时会出现锯齿状,Multisampling(全屏抗锯齿)就是使其变得平滑的技术。

像素格式

当我们创建一个表面或纹理时,经常需要指定这些Direct3D资源的像素格式

    D3DFMT_R8G8B8 ——表示一个24位像素,从左开始,8位分配给红色,8位分配给绿色,8位分配给蓝色。

    D3DFMT_X8R8G8B8 ——表示一个32位像素,从左开始,8位不用,8位分配给红色,8位分配给绿色,8位分配给蓝色。

    D3DFMT_A8R8G8B8 ——表示一个32位像素,从左开始,8位为ALPHA通道,8位分配给红

色,8位分配给绿色,8位分配给蓝色。

    D3DFMT_A16B16G16R16F ——表示一个64位浮点像素,从左开始,16位为ALPHA通道,16 位分配给蓝色,16位分配给绿色,16位分配给红色。

   D3DFMT_A32B32G32R32F ——表示一个128位浮点像素,从左开始,32位为ALPHA通道, 32位分配给蓝色,32位分配给绿色,32位分配给红色。

内存池

表面和其它一些Direct3D资源被放在多种内存池中。

    D3DPOOL_DEFAULT——表示Direct3D将根据资源的类型和用途把它们放在最合适的地方。这有可能是显存、AGP内存或者系统内存中。值得注意的是,这种内存池中的资源必须

要在IDirect3DDevice9::Reset被调用之前消毁掉,并且再次使用时必须重新初始化。

    D3DPOOL_MANAGED ——资源将由Direct3D管理并且按设备的需要来指定放在显存还是放在AGP内存中。当应用程序访问和改变资源时它先把这些资源拷贝到系统内存中,当需要

时Direct3D会自动把它们拷贝到显存里。

    D3DPOOL_SYSTEMMEM——指定资源放在系统内存中。

    D3DPOOL_SCRATCH——指定资源放在系统内存中,它与D3DPOOL_SYSTEMMEM不同之处在于使用这些资源不必受图形设备的限制。因此,参数使图形设备不能访问该内存池的

资源,但资源可以相互拷贝。

交换链与页面交换

Direct3D通常创建2~3个表面组成一个集合,即为交换链,通常由IDirect3DSwapChain 接口来表示。

Direct3D基础_第2张图片

交换链与页面交换的使用时为了动画表现的更加平滑,也就是所谓的双缓冲或三缓冲。

深度缓冲

深度缓冲也是一个表面,但它不是用来存储图像数据的,而是用来记录像素的深度信息

它能够表示出哪个图在前哪个图在后,如下图所示。

    D3DFMT_D32——表示32位深度缓冲

    D3DFMT_D24S8——表示24位深度缓冲并保留8位模版缓冲(stencil buffer

    D3DFMT_D24X8——表示24位深度缓冲

    D3DFMT_D24X4S4——表示24位深度缓冲并保留4位模版缓冲

D3DFMT_D16——表示16位深度缓冲

 

        Direct3D基础_第3张图片

顶点处理

顶点是3D图形学的基础,它能够通过两种不同的方法被处理,一种是软件方式(software vertexprocessing总是被支持且永远可用;另一种是硬件方式(hardware vertex processing),必须要显卡硬件支持顶点处理才可用(意味着硬件必须可以进行几何转换和光源计算)

设备能力

Direct3D支持的每一项特性都对应于D3DCAPS9结构的一个数据成员。初始化一个D3DCAPS9实例应该以你的设备实际支持特性为基础