设为首页收藏本站喵玉殿官方微博

 找回密码
 少女注册中
搜索
查看: 10744|回复: 11

[教程图书] Directx 接口与方法

  [复制链接]
发表于 2011-2-23 13:24:53 | 显示全部楼层 |阅读模式
本帖最后由 十二 于 2011-2-25 19:22 编辑

d3d9.rar (11.12 KB, 下载次数: 359)

D3D9 所有COM接口和方法,调试的时候COM接口不透明。


Direct3DCreate9获得IDirect3D9接口指针,其他接口指针获得方法类似。

发表于 2011-2-23 14:07:49 | 显示全部楼层
貌似和顯卡之類有關(?)
回复

使用道具 举报

 楼主| 发表于 2011-2-25 19:17:53 | 显示全部楼层
本帖最后由 十二 于 2011-2-25 19:19 编辑

Directx9的的调用并不像普通的程序那么显性用LordPE打开任何一个Dx9程序一般都能看到输入表会导入d3d9.dll的Direct3DCreate9函数,d3d9.dll下一般只有这一个函数导入,这里出现一个疑问Directx提供那么丰富的功能一个函数去实现显然是扯淡的。Directx采用了COM接口,所以函数以方法的形式封装在接口中,得到这些方法的实现显然是对Directx更深了解的过程。

下面将已调试作为探索,展开对Directx初始化的讨论。

首先当程序准备初始化Directx的时候会调用Direct3DCreate9,下面是Direct3DCreate9的原型。

函数原型:Direct3DCreate9(D3D_SDK_VERSION)
  该函数的参数必须是D3D_SDK_VERSION,只有如此方能保证应用程序使用正确的头文件,如果该函数调用失败,将返回一个NULL指针
  该函数的返回值是一个指向接口IDirect3D9的指针

能看到该函数只有有一个参数D3D_SDK_VERSION这个参数并不重要,值得注意的是该函数会返回一个IDirect3D9接口的指针。

可以在1L的附件d3d9.rar中找到此接口的定义。


  1. DECLARE_INTERFACE_(IDirect3D9, IUnknown)
  2. {
  3. /*** IUnknown methods ***/
  4. STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE;
  5. STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  6. STDMETHOD_(ULONG,Release)(THIS) PURE;

  7. /*** IDirect3D9 methods ***/
  8. STDMETHOD(RegisterSoftwareDevice)(THIS_ void* pInitializeFunction) PURE;
  9. STDMETHOD_(UINT, GetAdapterCount)(THIS) PURE;
  10. STDMETHOD(GetAdapterIdentifier)(THIS_ UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier) PURE;
  11. STDMETHOD_(UINT, GetAdapterModeCount)(THIS_ UINT Adapter,D3DFORMAT Format) PURE;
  12. STDMETHOD(EnumAdapterModes)(THIS_ UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) PURE;
  13. STDMETHOD(GetAdapterDisplayMode)(THIS_ UINT Adapter,D3DDISPLAYMODE* pMode) PURE;
  14. STDMETHOD(CheckDeviceType)(THIS_ UINT iAdapter,D3DDEVTYPE DevType,D3DFORMAT DisplayFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) PURE;
  15. STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) PURE;
  16. STDMETHOD(CheckDeviceMultiSampleType)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels) PURE;
  17. STDMETHOD(CheckDepthStencilMatch)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) PURE;
  18. STDMETHOD(CheckDeviceFormatConversion)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat) PURE;
  19. STDMETHOD(GetDeviceCaps)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps) PURE;
  20. STDMETHOD_(HMONITOR, GetAdapterMonitor)(THIS_ UINT Adapter) PURE;
  21. STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) PURE;
  22. };
复制代码
此定义中应该值得注意的是CreateDevice这个方法。当然你要是对其他方法感兴趣可以在OD中跟踪Direct3DCreate9返回的指针(EAX中的值)找到该方法的确切位置,或者查找MSDN。

CreateDevice方法的的原型

http://baike.baidu.com/view/3887791.htm

此方法的地6个参数会得到IDirect3DDevice9接口的指针。但是在我机器上OD实际是第7个参数。第一个参数为Direct3DCreate9返回的指针。

方法依旧在1L附件的d3d9.rar中找到IDirect3DDevice9接口的定义,可以看到很多方法实现了很多功能,代码过多这里不贴。

这样你就可以在OD中跟踪Directx的详细实现方法。

大部分流程是用CreateVertexBuffer方法来创建Vextex Buffer

CreateVertexBuffer方法的倒数第二个参数指向一IDirect3DVertexBuffer9接口。

IDirect3DVertexBuffer9接口定义如下

  1. #undef INTERFACE
  2. #define INTERFACE IDirect3DVertexBuffer9

  3. DECLARE_INTERFACE_(IDirect3DVertexBuffer9, IDirect3DResource9)
  4. {
  5. /*** IUnknown methods ***/
  6. STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE;
  7. STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  8. STDMETHOD_(ULONG,Release)(THIS) PURE;

  9. /*** IDirect3DResource9 methods ***/
  10. STDMETHOD(GetDevice)(THIS_ IDirect3DDevice9** ppDevice) PURE;
  11. STDMETHOD(SetPrivateData)(THIS_ REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) PURE;
  12. STDMETHOD(GetPrivateData)(THIS_ REFGUID refguid,void* pData,DWORD* pSizeOfData) PURE;
  13. STDMETHOD(FreePrivateData)(THIS_ REFGUID refguid) PURE;
  14. STDMETHOD_(DWORD, SetPriority)(THIS_ DWORD PriorityNew) PURE;
  15. STDMETHOD_(DWORD, GetPriority)(THIS) PURE;
  16. STDMETHOD_(void, PreLoad)(THIS) PURE;
  17. STDMETHOD_(D3DRESOURCETYPE, GetType)(THIS) PURE;
  18. STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) PURE;
  19. STDMETHOD(Unlock)(THIS) PURE;
  20. STDMETHOD(GetDesc)(THIS_ D3DVERTEXBUFFER_DESC *pDesc) PURE;
  21. };
复制代码

这里你就能看到一些Dx在定义定点前必用的方法函数Lock和Unlock了

同理你还可以用OD来跟踪SetStreamSource方法SetFVF以及DrawPrimitive来看到具体的画法流程。

这样你就不难理解为什么DX只导入一个函数就能实现那么多功能了。

部分资料来源百度,和各大论坛。


评分

参与人数 1积分 +12 收起 理由
真PKS同志 + 12 感谢共享

查看全部评分

回复

使用道具 举报

发表于 2011-2-25 20:52:58 | 显示全部楼层
12大神触是也!
回复

使用道具 举报

发表于 2011-3-5 15:47:31 | 显示全部楼层
吐槽向。。。
回复

使用道具 举报

 楼主| 发表于 2011-3-13 10:59:09 | 显示全部楼层
directsound 接口与方法 dsound.rar (15.76 KB, 下载次数: 297)
回复

使用道具 举报

发表于 2011-3-13 23:01:54 | 显示全部楼层
DX果然是浮云……浮云……触死我了
回复

使用道具 举报

发表于 2011-3-15 12:49:06 | 显示全部楼层
忙里偷闲回来看看,发现十二君又发有好物在这里呐
回复

使用道具 举报

 楼主| 发表于 2011-3-17 17:57:24 | 显示全部楼层
回复 神符影之歌 的帖子

算不上神马好物

#7
其实多翻翻MSDN和推推度娘一点也不触全是浮云+998

#4
喝茶君饶命
回复

使用道具 举报

 楼主| 发表于 2011-4-15 11:21:51 | 显示全部楼层
dinput.rar (28.27 KB, 下载次数: 282)

补一个 DirectInput的头文件和几个DX助手函数:

DirectInputCreate、DirectSoundCreate、Direct3DCreate。

Direct3DCreate获取IDirect3D接口指针。
DirectSoundCreate获取
IDirectSound接口指针。
DirectInputCreate获取IDirectInput接口指针。

CoCreateInstance 下的CLSID值HEX下前64bit为反着的- =、后64bit为正着的- = 好囧。






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|无图版|手机版|小黑屋|喵玉殿

GMT+8, 2025-10-31 12:11

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表