首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
 您现在的位置: 中国IT实验室 >> 游戏开发 >> 游戏开发入门 >> 正文
DirectX 3D编程入门教程一 D3D对象及设备
来源:ChinaItLab 作者: 时间:2004-12-29


  前言:
  应几个网友的要求,利用工作之余,写了一篇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图形概念我们还没有提及到,在以下的章节里,我回一一为大家介绍。
【责编:admin】

中国IT教育热线咨询

相关文章
游戏开发新手入门之位图化图形
给希望成为游戏美术设计师的朋友
Ogre游戏引擎鼠标选取物体演示  
所有绘画的核心灵魂——素描知识
DirectDraw与DirectInput游戏编程体验
推荐文章

 精彩友情推荐
·Asp源码 PHP源码
·CGI源码 JSP源码
·建站书籍教程
·服务器软件 .net源码
·建站工具软件
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
 基础入门  开发文档
 最新推荐
  多数的Windows程序都需要Windows.h和Windowsx.h这两个头文件,要确保使用它们。当然,你还需要其它......
游戏引擎演化史
在Windows上安装OGRE的方法
关于滤镜遮罩概念,Sobel 遮罩
游戏开发新手入门之Windows编程
游戏开发新手入门之位图化图形
教你实现卡通渲染的另类勾边方法
游戏设计大师谈如何成为一名游戏设
Visual C#编写 3D游戏框架示例
真正的 Java 学习从入门到精通
游戏开发经验——游戏开发的基本常
  为什么要研究攻击行为在人类有记载的5600年的历史中,共计发生了14,400次战争;今天,平均一天要发生............
游戏开发中显示对话的特殊句法
游戏原型设计的介绍
网络游戏中的攻击行为
谈动作类游戏的必要条件
规则的多元分析模式
载入位图文件到DirectDraw
Archer Game Suite 是什么?
浅谈游戏企划-新手入门篇
暴雪称霸游戏业界的六大秘密绝招
骨骼动画及示例Skinned Mesh的解析
  培训中心