DirectX 3D编程入门教程一 D3D对象及设备

一, D3D对象 ( D3D Object)

主要讲述以下几方面的内容:

1.关于D3D对象
微软Direct3D时基于COM的对象和接口的,Direct3D编程的第一步必须建立这个对象。而且程序结束后, 你必须最后释放该对象。

2.建立D3D对象
在DirectX8.0中,你可以用如下代码建立一个D3D对象:

#include <d3dx8.h> // 必须包含的头文件
#include <mmsystem.h>

LPDIRECT3D8 g_lpD3D = NULL; // D3D对象指针,以后经常用到
if( NULL == (g_lpD3D=Direct3Dcreate8(D3D_SDK_VERSION) ) ) // D3D_SDK_VERSION确保该对象建立正确的头文件上,目前只能用该值。
return E_FAIL;




二, D3D设备 ( D3D Device )

主要讲述以下几方面的内容:

1.什么是D3D设备?
一个D3D设备接口可以简单的认为是本机一块显卡的抽象,它包含了显卡所有的硬件参数及状态值,比如 说,显卡显存的数量和起始的线性地址,是否支持深度缓冲(Depth Buffer),雾化(Fog),纹理(Texture) 及MipMap等。

2.D3D设备的功能
在D3D编程中,一个D3D设备接口主要能完成以下的功能模块:
a. 转换功能(Transformation): 主要完成对3D 模型数据的转换,例如,世界转换( World transformation),视转换(View transformation),投影转换(Projection transformation)。
b. 灯光照明功能: 完成对场景的灯光渲染,例如,设置环境光,方向光等。
c. 光栅化显示功能: 根据设置的一些3D状态参数和当前屏幕显示模式以及剪切等情况,将3D图形在屏幕 上显示出来。

3.D3D设备的类型
在DirectX 8.0中,支持三种类型的D3D设备:硬件抽象层设备,参比设备,软件模拟设备,每一种设备可 以认为是一种独立的3D驱动程序,但也各有用途和优势,下面详细说明。

a. 硬件抽象层设备 ( HAL Device):D3D中最主要的设备类型,基于显卡的硬件功能,具有很快的3D硬件 加速功能,能执行硬件或软件的顶点数据处理。缺点是必须有3D显卡支持( 如果你没有足够的钱买好 的显卡的话,也只能望洋兴叹了),而且,并不是每种显卡都支持所有的3D功能,所以在使用该设备 时,必须经常查询显卡支持的功能,对不支持的用软件设备来模拟。

b. 软件模拟设备(Software Device): 顾名思义,是用软件的方法来模拟3D的一些功能。依赖于一些特 殊的CPU指令集( 比如,AMD 3D-Now, Intel MMX指令集), 软件模拟设备也能获得较高的3D性能。而 且软件模拟设备具有硬件抽象层设备一样的函数接口,使用方便。缺点是大量占用CPU资源,运行速度 较慢,只适合同硬件抽象层设备配合使用。

c. 参比设备(Reference Device):是微软Direct3D支持的一种附加设别类型,它也依赖于特殊的CPU指令 集,但同软件模拟设备相比,它更注重模拟的精确性,而不是速度方面。所以它一般应用于对3D硬件 的测试和硬件功能的演示上。

4.建立D3D设备
在DirectX 8.0中,建立一个D3D设备需要到用IDirect3D8 接口中的CreateDevice函数,该函数原型如下

HRESULT CreateDevice(
    UINT Adapter,
    D3DDEVTYPE DeviceType,
    HWND hFocusWindow,
    DWORD BehaviorFlags,
    D3DPRESENT_PARAMETERS* pPresentationParameters,
    IDirect3DDevice8** ppReturnedDeviceInterface
);

函数参数说明可以查询DirectX 8.0 SDK 的文档,不过是英文的,下面给出一段代码说明:

// 该段代码建立一个基于Window窗口程序的D3D硬件抽象层设备,采用软件的顶点数据处理,并使用16Bits 的深度缓冲区。

D3DDISPLAYMODE d3ddm;
HRESULT hr = 0;

hr = g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );
if( FAILED(hr) )
    return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; // 指明是窗口模式,而非全局独占模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 无需交换链
d3dpp.BackBufferFormat = d3ddm.Format; // 后备缓冲区颜色格式
d3dpp.EnableAutoDepthStencil = TRUE; // 使深度缓冲区有效
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 深度缓冲区颜色格式

// Create the D3D Device
hr = g_pD3D->CreateDevice(
    D3DADAPTER_DEFAULT, // 使用当前显卡作注设备
    D3DDEVTYPE_HEL, // 设备类型
    hWnd, // 该程序所在的窗口句柄
    D3DCREATE_SOFTWARE_VERTEXPROCESSING, // 用软件的方法处理顶点数据
    &d3dpp, // 指向上面的结构
    &g_pd3dDevice ) ) ) // 指向3D设备的指针
if( FAILED(hr) )
{
    return E_FAIL;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值