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

Direct3D初始化(上)


一、Direct3D概述

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

图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图像数据的一个像素矩阵。(虽然我们可以将表面存储点数据看成一个矩阵,但实际是存储在一个线性数组中)

图1.2  表面

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

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


        多重采样
        用像素矩阵表示图像时,往往会出现块状效应。多重采样能够平滑块状图像,常用于全屏反走样。
【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)_第1张图片
图1.3 左边是锯齿线。右边是经过多重采样处理的反走样线。

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

        
        像素格式
        创建表面和纹理时,需要指定这些Direct3D资源的像素格式。可以用  D3DFORMAT  枚举类型的枚举常量来表示。
【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)_第2张图片

       内存池
       表面和其他Direct3D资源可以放入许多类型的内存池中。内存池的类型可以用  D3DPOOL  枚举类型表示。
【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)_第3张图片

        交换连和页面切换 
        交换连和页面切换技术主要用于生成更加平滑的动画。
        完成绘制功能的程序结构为:
        (1)在后台缓存中进行绘制。
        (2)提交后台缓存的内容。
        (3)循环(1)(2)步骤。
【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)_第4张图片
【DirectX 9.0学习之路(第一话)】——Direct3D初始化(上)_第5张图片

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

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

        

你可能感兴趣的:(DirectX,DirectX,Direct3D,9.0,Direct3D初始化)