DirectX3D编程入门教程一D3D对象及设备(转)

DirectX3D编程入门教程一D3D对象及设备(转)[@more@]

  前言:

  应几个网友的要求,利用工作之余,写了一篇DirectX 3D(简称D3D)编程入门教程。该教程适用于一些刚刚涉及D3D编程的朋友,读者必须有一定的C++ 和Win32的编程知识。对一些大虾级的高手,这只能使班门弄斧了,同时也非常欢迎爱好D3D编程的朋友和我联系和交流,并提出宝贵意见。

  该教程基于DirectX 8.0 Graphics, 一部分内容由DirectX 8.0 SDK 英文文档翻译而来,一部分是自己工作经验的总结,作者对此享有著作权,读者可任意拷贝和传播,但不包含商业的用途,转贴请注明出处。

  

  一, D3D对象 ( D3D Object)

  

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

  

  1.关于D3D对象

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

  

  2.建立D3D对象

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

  

  #include // 必须包含的头文件

  #include

  

  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;

  }

  

  该节内容讲完了,如果看完后你觉得头晕眼花,不知所云的话,也是很正常的,因为有好多的3D图形概念我们还没有提及到,在以下的章节里,我回一一为大家介绍

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8225414/viewspace-952124/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225414/viewspace-952124/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值