天天看点

【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)Direct3D初始化(上)

Direct3D初始化(上)

一、Direct3D概述

        Direct3D是一套底层图形API(Application Programming Interface, 应用程序编程接口),借助该API,我们能够利用硬件加速功能绘制3D场景。Direct3D可以被视为应用程序与图形设备(3D硬件)交互的中介。下图展示了三者之间的关系:

【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)Direct3D初始化(上)

图1.1  应用程序、Direct3D、硬件三者关系

        图1.1中的Direct3D部分是一套已定义好的、由Direct3D提供给应用程序/编程人员的接口和函数,这些接口和函数代表了当前版本的Direct3D所支持的全部功能。 在Direct3D和图形设备之间有一个HAL(Hardware Abstraction Layer, 硬件抽象层)。因为市面上的显卡种类繁多,每种卡的性能和同样功能实现有差异,所以需要定义一个统一的标准HAL,使得Direct3D不用关心显卡类型,其规范的制定可独立于具体的硬件。

        有时,Direct3D提供的某些功能不为您的图形设备所支持,但您仍希望使用这些功能。为了满足这种需求,Direct3D提供了REF设备,即参考光栅设备(reference asterizer device)。它能够以软件运算方式完全支持Direct3D API 。不过,REF设备仅用于开发阶段,它与Direct3D SDK捆绑在一起,无法发布给最终用户。此外,REF设备速度十分缓慢,在测试以外的场合都很不实用。

二、COM(组件对象模型)

        COM(Component Object Model, 组件对象模型),是一项能够使DirectX独立于编程语言并且向下兼容的技术。通常称为COM对象接口,可将其视为一个C++类来使用。创建COM接口时不能使用关键字 new。并且使用完一个接口,应该调用相应的Release方法,而不是使用C++中的delete。(所有的COM接口都继承自COM接口IUnknown ,该接口提供了Release方法)。         所有的COM接口都有一个前缀 I 。

三、预备知识

        表面                表面是Direct3D存储2D图像数据的一个像素矩阵。(虽然我们可以将表面存储点数据看成一个矩阵,但实际是存储在一个线性数组中)

【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)Direct3D初始化(上)

图1.2  表面

        用接口 IDirect3DSurface9来描述表面。该接口提供几种直接从表面读取和写入数据的方法,以及一种获取表面相关信息的方法。主要方法如下:

        (1) LockRect        锁定表面存储区,以获取指向表面存储区的指针。         (2)UnlockRect    和LockRect方法配套使用,解除锁定。         (3)GetDesc         该方法通过填充结构 D3DSURFACE_DESC 来获取该表面的描述信息。

        多重采样         用像素矩阵表示图像时,往往会出现块状效应。多重采样能够平滑块状图像,常用于全屏反走样。

【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)Direct3D初始化(上)

图1.3 左边是锯齿线。右边是经过多重采样处理的反走样线。

        D3DMULTISAMPLE_TYPE  枚举类型包含了一系列枚举常量值,用于表示对表面进行多重采样的级别。

                 像素格式         创建表面和纹理时,需要指定这些Direct3D资源的像素格式。可以用  D3DFORMAT  枚举类型的枚举常量来表示。

【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)Direct3D初始化(上)

       内存池        表面和其他Direct3D资源可以放入许多类型的内存池中。内存池的类型可以用  D3DPOOL  枚举类型表示。

【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)Direct3D初始化(上)

        交换连和页面切换          交换连和页面切换技术主要用于生成更加平滑的动画。         完成绘制功能的程序结构为:         (1)在后台缓存中进行绘制。         (2)提交后台缓存的内容。         (3)循环(1)(2)步骤。

【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)Direct3D初始化(上)
【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)Direct3D初始化(上)

        深度缓存         深度缓存(depth  buffer)亦称 z-缓存。为最终绘制的图像中的每一个像素都保留了一个深度项。         深度缓存用于计算每个像素的深度值并进行深度测试。深度测试是根据深度值选出位于同一位置的像素应该显示哪个。距离摄像机最近的像素获胜。         深度缓存的格式决定深度测试的精度。但一般情况下,大多数应用程序采用24位深度缓存已经足以获得满意的结果。         

【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)Direct3D初始化(上)

        顶点运算         顶点运算有2种:(1)硬件顶点运算 (2)软件顶点运算         硬件顶点运算只有得到图形卡的支持才能使用。         我们应该优先考虑硬件顶点运算,因为速度快、不占用CPU。

继续阅读