请教directx高手

feng 2000-04-24 01:07:00
小弟工作中要用到directx,但我对它却一点不懂.
不知那位vc高手肯指点一二,定衔草相抱.
email: fyan@csrd.org
...全文
156 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
feng 2000-04-25
  • 打赏
  • 举报
回复
感谢二位,但我想知道的不是一些笼统的概念和代码.
而是想在我程序中出现问题时,可以找一个高手给我一些参考(指导最好).
再次感谢.
sysadm 2000-04-24
  • 打赏
  • 举报
回复
<<<<更全面的资料可mail to sys_adm@263.net
DirectX5.0最新游戏编程指南
一、DirectX和部件对象模型COM
1.1、 部件对象模型COM(Component Object Model)
DirectX中的大部分API都由基于COM的对象和接口组成。COM是接口重利用的基于对象的系统的基础,是COM编程的核心模型,
它也是一种接口规范。在操作系统级别上,它又是一个对象模型。
许多DirectX API都创建为COM对象的实例。你可以将一个对象看做一个黑盒子,对象通过接口与对象通信,通过COM接口发送给对
象或从对象接收的命令称为方法。例如,IDirectDraw2::GetDisplayMode方法是通过IDirectDraw2接口从DirectDraw对象获得当前的显示模
式。对象在运行时可以同其他对象捆绑在一起,并且能够使用这些对象的接口。如果你已知道某个对象是COM对象,并且知道该对象支持
的接口,你的应用程序或其他对象就能够确定第一个对象所能执行的服务。所有COM对象都继承的一个方法是Query接口方法,它让你确
定一个对象支持的接口和创建这些接口的指针。
1.2、IUnknown 接口
所有的COM 接口都由一个称为Iunknown的接口衍生而来,该接口为DirectX提供了对象生存期的控制和操作多接口发能力。Iunknown
含有三个方法:
.AddRef 当一个接口或另一个应用捆绑到一个对象上时,就使用AddRef方法将该对象的索引值加1。
.QueryInterface 通过指向特定接口的指针查询对象所支持的特性。
.Release 将对象的索引值减1,当索引值变为0时,该对象就从内存中释放。
其中AddRef和Release方法负责维护对象的索引值。例如,如果创建一个DirectDrawSurface对象,该对象的索引值就被设定为1,每
次当有一个函数返回该对象的指针时,该函数必须通过返回发指针调用AddRef方法将该对象的索引值加1。每一个AddRef的调用都必须有
一个Release的调用与其对应。当对象的索引值达到0时,该对象就被撤消,该对象的所有接口都不可再用。
QueryInterface方法测定一个对象是否支持指定的接口,如果支持,QueryInterface就返回指向该接口的指针。然后你可以使用该接口包
含的方法同对象通信。如果QueryInterface成功地返回接口的指针,它会自动调用AddRef方法增加对象的索引值。在撤消接口指针之前必须
调用Release来减少对象的索引值。
1.3、 DirectX COM 接口
DirectX中的接口是用相当基本的COM编程创建的。表征了设备的对象的每个接口都由IUnknown COM接口派生而来,如IDirectDraw2、
IDirectSound和IDirectPlay都是这样。基本对象的创建工作由动态链接库DLL中的特殊函数来处理。
典型的情况是,DirectX对象模型为每个设备提供了一个主对象。其它支持服务的对象由主对象派生而来。例如,DirectDraw对象就表
征了显示适配器。你可以利用DirectDraw来创建表征显示内存的DirectDrawSurface对象和表征硬件调色板的DirectDrawPalette对象。同样
道理,DirectSound对象表征了音频卡,利用它可创建表征音源的DirectSoundBuffer对象。
除了能够产生子对象外,设备的主对象还能测定它所表征的设备的性能,如屏幕的大小和颜色数、声卡是否支持波表合成等。
1.4、 C++和COM 接口
对C++程序员来说,COM接口就象一个抽象的基类。在C++的基类中,所有的方法都定义为纯虚的,这就意味着没有任何代码同方法
关联在一起。纯虚的C++函数和COM接口都使用一种称为虚表(vtable)的设备。一个虚表包含了应用于所给接口的所有函数的声明。如果
你想让程序或对象使用这些函数,可以先用QueryInterface方法检查对象存在的接口,获取该接口的指针,调用QueryInterface后,应用或对
象实际上就从对象中接收到了虚表的指针,通过该指针就可以调用应用于该对象的所有接口方法。
COM对象和C++的另一个相似之处是方法的第一个参数就是接口或类的名字,C++中称为this参数。因为COM对象和C++对象是完全
二进兼容的,编译器就将COM接口同C++抽象类同样处理,并且具有相同的语法,这会使得代码简单一些。
1.5、 获取新的接口
部件对象模型不是通过改变存在的接口中的方法而是通过扩展包含有新特性的新接口来更新对象的功能。在保留已有的接口状态的情况
下,COM对象能够自由扩展服务并维持同旧的应用兼容。DirectX部件遵循这一原则,例如,DirectDraw部件支持IDirectDrawSurface 接口
的三个版本: IDirectDrawSurface、IDirectDrawSurface2和IDirectDrawSurface3。要想利用新接口提供的特性,你必须调用对象的
IUnknown::QueryInterface方法,指定欲获取的接口的全局统一标识GUID(globally unique identifier)。接口的GUID在相关的头文件中声明。
下面的例子说明了如何查询一个新的接口:
LPDIRECTDRAW lpDD1;
LPDIRECTDRAW2 lpDD2;

ddrval = DirectDrawCreate( NULL, &lpDD1, NULL );
if( FAILED(ddrval))
goto ERROROUT;

// Query for the IDirectDraw2 Interface
ddrval = lpDD1->Query接口(IID_IDirectDraw2, (void **)&lpDD2);
if( FAILED(ddrval))
goto ERROROUT;

// Now that we have an IDirectDraw2, release the original Interface
lpDD1->Release();
新的接口不支持以前版本接口所提供的方法的情况极少,IDirect3DDevice2接口刚好是这样的一个接口。如果你的应用需要早期版本的
接口提供的特性,你可以利用老的接口的GUID,使用上述例程来查询该接口。
1.6、 用C存取COM对象
使用C语言也可以调用任何COM接口方法。用C语言调用一个接口方法需要主要两件事:
.方法的第一个参数始终是已经创建的调用该方法的对象(即this)
.接口中的每个方法都通过对象虚表的指针来引用
下面的例子使用C语言调用IDirectDraw2::CreateSurface方法创建一个同一个DirectDraw对象关联的表面:
ret = lpDD->lpVtbl->CreateSurface (lpDD, &ddsd, &lpDDS,
NULL);

其中 lpDD参数是同新表面关联的DirectDraw对象,同时,该方法填充一个描述表面(Surface)的结构&ddsd,返回指向新接口&lpDDS
的指针。调用 IDirectDraw2::CreateSurface方法,首先要指向该DirectDraw对象的虚表,然后获取虚表中的方法。方法中提供的第一个参数
是已经创建的DirectDraw 对象的索引。下面的代码说明了C和C++对COM对象方法调用的不同之处:
ret = lpDD->CreateSurface(&ddsd, &lpDDS, NULL)

二、DirectX 5中的新内容
大家知道, DirectX 5是DirectX的最新版本,在此之前,Microsoft曾发布过DirectX、DirectX2、DirectX3(没有DirectX4)。显然,DirectX
5比DirectX3提供了更多的功能和服务,不过,利用DirectX3 API写的程序不需要修改就可以成功地编译和运行。下面是DirectX5和DirectX3
的主要不同之处:
2.1、DirectDraw
DirectDraw扩展了新的视频端口能力,允许应用程序控制从硬件视频端口传送到显示内存中的DirectDraw表面的数据流。另外,DirectDraw
硬件仿真层HEL(Hardware Emulate Layer)能够利用Pentium MMX处理器提供的加速性能。DirectDraw在你第一次创建一个表面时会检测
处理器是否MMX处理器,在非奔腾处理器的计算机上,该测试会导致调试器报告出一个事件,该事件不会影响程序的性能和稳定性。
DirectDraw支持比主表面(Primary Surface)更宽的屏外表面(Off-screen Surface),只要硬件允许,你可以创建足够宽的表面。
DirectDraw支持高级图形端口AGP(Advanced Graphics Port)特性。在一个AGP设备系统,你可以在非本地显示内存创建表面。DDSCAPS
结构支持标准(本地)显示内存和AGP(非本地)显示内存之间不同的标志。DirectDraw 可以向非本地显示内存位块传输DDCAPS结构包
含的成员信息。
2.2、DirectPlay
DirectPlay包含了一个新的接口IDirectPlay3,除了新的方法之外,其它同IDirectPlay2完全相同。同样地,IDirectPlayLobby2也是
IdirectPlayLobby的升级版本。DirectPlay的新功能包括通过创建连接快捷方式来隐藏服务提供者(Service Provider)对话的能力,还可以保
持可用会话的更新列表,应用SetSessionDesc方法更好地支持口令保护会话,支持保密服务连接及使用CoCreateInstance直接创建多个
DirectPlay对象。
2.3、DirectSound
DirectSound 包含了一个新的接口IksPropertySet,使得支持由声卡和相关驱动程序提供的扩展服务。基于COM的函数DirectSoundCapture
也是新的,它可以直接访问驱动程序。
2.4、Direct3D
Direct3D即时模式(Immediate Mode)现在支持Drawing Primitive,而不必直接在缓冲区中工作。Direct3D保留模式(Retained Mode)
支持插值使你能够调和颜色,平滑地移动物体,变形网格,并且执行许多其他的变换。保留模式也支持渐进网格,即允许你先开始于一个粗
糙的网格,然后再细化它。
5、DirectInput
DirectInput提供了操纵杆的COM接口,同时还提供了键盘和鼠标等力反馈装置的COM接口。
6、DirectSetup
DirectSetup现在包含了更多的用户接口定制能力,而这是由一个回调函数提供的。该回调函数将当前的安装状态传递给安装程序,你可
以通过定制的用户接口利用这一信息来显示安装状态。另外,DirectSetup提供了多个玩家的游戏的方法,在游戏中,玩家可以使用
DirectPlayLobby从注册表中去掉注册信息。
6、AutoPlay AutoPlay同DirectX3中一样,未做变动。

DirectX5.0最新游戏编程指南
DirectDraw篇

DirectDraw是DirectX SDK的主要部分之一,它允许你直接对显示内存操作,支持硬件位块传输、硬件覆盖、表面翻转,并且保持同目
前的基于Windows的应用程序和驱动程序兼容。
DirectDraw是一种软件接口,它除了能直接对显示设备存取外,还保持同Windows图形设备接口GDI(Graphics Device Interface)兼容。
对于图形来说,它并不是一种高级应用程序接口。DirectDraw提供了一种设备无关性的方法,使得基于Windows的应用软件和游戏(例如
三维图形软件包和数字视频游戏)能直接获取显示设备的特性。
DirectDraw能工作于各种各样的显示设备,从简单的SVGA显示器到能够提供剪切、拉伸和非RGB格式支持的高级显示设备。DirectDraw
接口使得你的应用程序能仿真基本硬件的性能并使用硬件加速特性;硬件不提供的特性将由DirectX来仿真。DirectDraw提供的对显示内存
的设备无关性的访问能使你很容易地管理显示内存。你的应用程序只需要识别一些基本的设备属性,它们都是标准的硬件应用,例如RGB
和YUV格式的颜色。你不需要调用特殊的过程来使用位块传输或操纵调色板寄存器。使用DirectDraw,你可以很容易地操作显示内存,充
分利用不同类型显示设备的位块传输和颜色解压功能,而不需要依赖于特定的硬件。DirectDraw可以运行在Windows95/NT4.0和以后的版本
中。
DirectDraw的硬件抽象层HAL(Hardware Abstraction Layer)提供了统一的接口,通过该接口,程序可以直接在显示内存或视频内存中
工作,获取硬件的最佳性能。
DirectDraw对视频硬件的性能进行估计,只要可能就会使用硬件提供的特定性能。例如,如果视频卡支持位块传输,DirectDraw就会把
位块传输委托给视频卡,CPU不参与位块传输的处理,这就大大提高了程序运行的性能。另外,DirectDraw提供了硬件仿真层HEL(Hardware
Emulation Layer ),使得在某些硬件不存在时可以用软件仿真来支持本应该由这些硬件提供的特性。
DirectDraw运行在Windows 95上,能够利用32位内存的优越性和操作系统提供的“平坦”内存模型。DirectDraw将系统内存和视频内
存作为大块存储而不是一小段一小段地使用。另外,DirectDraw还为 Windows图形程序员带来了许多强大的功能:
.DirectDraw使得在全屏模式下的应用多个后台缓冲区的页翻转变得容易
.支持窗口模式和全屏模式下的剪切功能
.支持三维 Z缓冲区
.支持Z方向的硬件辅助覆盖
.提供对图象拉伸的硬件的存取
.同时访问标准的和增强的显示设备内存区域
.动态调色板、独占式的硬件访问、分辨率切换等
将这些特性结合在一起,你就可以较容易地编制出性能超过基于GDI的标准Windows游戏甚至是MS-DOS下的游戏。

tibetty 2000-04-24
  • 打赏
  • 举报
回复
DirectX = DirectDraw + DirectSound + Direct3D + DirectPlay + DirectSetup
2D图象操作 声音操作 3D 连接支持 安装支持

不只你想知道什么?
你可以到情话BBS侃侃 bbs.edu.cn

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧