• Direct3D基础


    1. Direct3D概述

    Direct 3D 是一种低层图形API( Application Programming Interface,应用程序接口), 它能让我们利用3D 硬件加速来渲染3D 世界。我们可以把Direct3D看作是应用程序和图形设备(3D硬件)之间的中介。通过利用Direct3D API编程,能够屏蔽许多底层实现的技术细节,缩短开发周期。下图显示了Direct3D,H AL(Hardware Abstraction Layer,硬件抽象层)及硬件之间的关系。其中HAL即硬件抽象层,是一组指示设备执行某种操作的特殊设备代码的集合,由设备制造商实现,Direct3D不能直接作用于图形设备,通过使用HAL与硬件图形设备协同工作。如下图所示,Direct3D应用程序最终通过图形卡的设备驱动程序访问图形硬件。由于HAL存在,Direct3D将可以不需要了解某个设备的具体硬件特性,使它能够独立于硬件设备。Direct3D提供了相应的方法在运行时检查设备是否能执行某项操作。

                                                              

      

    图2.2.1  Direct3D层次

    2. Direct3D重要概念

    1. 近似顶点: 一个场景是多个物体或模型的集合。一个物体可以用三角形网格来表示,3D世界中最基本的图元就是三角形,一个多边形的两边相交的点叫做顶点。为了描述一个三角形,我们通常指定三个点的位置来对应三角形的三个顶点,这样我们就能够很明确的表示出这个三角形。3D物体中的三角形经常会有许多共用顶点。为了解决复杂精细场景重复顶点占用更多的渲染带宽,我们在创建一个顶点列表的同时也创建一个索引列表。顶点列表包含所有不重复的顶点,索引列表中则用顶点列表中定义的值来表示每一个三角形的构造方式。通常每个顶点都包含如下信息:x,y,z坐标值、颜色值、用于计算灯光的法线和纹理坐标(u, v)。

    2. 表面:是一个像素点阵,主要用来存储2D图形数据。表面数据就像一个矩阵,像素数据实际上是存储在线性数组里面。Direct3D里面的IDirect3DSurface9接口用来描述表面,这个接口提供一些方法来直接操作表面数据。

    3. 多重采样(MultiSampling) :由于使用像素来表示图像,在显示时会出现锯齿状。MultiSampling就是使图像变得平滑的技术。它的最普通的用法就是全屏抗锯齿。D3DMULTISAMPLE_TYPE枚举类型能使我们制定全屏抗锯齿的质量等级。

    4. 交换链和页面交换:Direct3D通常建立2--3个页面组成一个集合,即为交换链,通常由IDirect3DSwapChain接口来表示。交换链和页面交换技巧被用在使两帧动画之间过渡更加平滑。通常由Direct3D自己去管理。

    5. 深度缓冲:深度缓冲是一个表面,但它不是用来存储图像数据而是用来记录像素的深度信息。深度缓冲为每一个像素计算深度值,并进行深度测试。通过深度测试我们可以知道哪个像素离摄像机近从而把它画出来。这样就可以只绘制最靠近摄像机的像素,被遮住的像素就不会被画出来。

    6. 顶点处理:顶点是3D图形学的基础,它能够通过两种不同的方法来处理,一种是:软件顶点处理(Software Vertex Processing),二种是:硬件顶点处理(Hardware Vertex Processing)。前者总是被支持而且永久可用,后者要显卡硬件支持顶点处理才可用。使用硬件顶点处理总是首选,因为它比软件方式更快,而且不占用CPU资源。如果一块显卡支持硬件顶点处理的话,也就是说它支持硬件几何变换和光照计算。

    7. 设备能力:Direct3D支持的每一种特性都对应于D3DCAPS9结构的一个数据成员,初始化一个D3DCAPS9实例应该以你的设备实际支持的特性为基础。因此,在我们的应用程序里,我们能够通过检测D3DCAPS9结构中相对应的某一成员来检测设备是否支持这一特性。

    3. Direct3D初始化

    初始化步骤:

    1. 获得 IDirect3D9接口指针。

    2. 检查设备的技术特性,确定显卡是否支持硬件顶点处理。

    3. 初始化一个D3DPRESENT_PARAMETER结构实例,这个结构包含了许多数据成员,它允许我们指定将要创建IDirect3DDevice9接口的特性。

    4. 创建一个基于已经初始化好了的D3DPRESENT_PARAMETER结构的IDirect3DDevice9对象。

  • 相关阅读:
    IOS数据持久化之归档NSKeyedArchiver
    Java中导入、导出Excel
    IOS开发中多线程的使用
    深入分析动态管理Fragment
    IOS开发之数据sqlite使用
    如何在Eclipse和Tomcat的Debug过程中启用热部署
    在PHP中无法连接Memcached的解决办法
    Apache mod_rewrite规则重写的标志一览
    Java多线程中run(), start(), join(), wait(), yield(), sleep()的使用
    Centos5.8下编译安装PHP5.4和memcached, phalcon, yaf, apc
  • 原文地址:https://www.cnblogs.com/liwenbin/p/2566484.html
Copyright © 2020-2023  润新知