• 【转】D3DXLoadSkinMeshFromXof函数及.x在不同dx版本中


    在看到《DirectX 角色扮演游戏编程》这书第二章中的.x程序,运行光盘上的代码出错
    error C2664: 'D3DXLoadSkinMeshFromXof' : cannot convert parameter 1 from 'IDirectXFileData *' to 'LPD3DXFILEDATA'
    后来才发现,这书上的代码都是DirectX9b版本的,而我用的是DirectX9c,因为9c是9b的升级版,不想用回9b了,于是想在9c中解决这个问题。
    从DirectX SUMMER2004(dx9c)之后才增加了ID3DXFileData,网上都说它是原来IDirect3DFileData的升级,具体性能上有什么提高我也是不清楚,但是因为这个改动导致一些函数调用产生了挺郁闷的错误,首先是我现在遇到的这个D3DXLoadSkinMeshFromXof()函数了,还有一些与.x有关的一些函数也出现了问题,像D3DXLoadPatchMeshFromXof(),D3DXLoadMeshFromXof()等函数的参数改变了DX9.0B的版本是IDirect3DFileData的参数现在改成了ID3DXFileData。再者就是以前版本的遍历.X文件中的骨骼的函数改变了原先是通过IDirect3DFileData的是通过IDirectXFileEnumObject::GetNextDataObject()来查看下一个对象,现在是通过ID3DXFileEnumObject::GetChildren(获取总体节点个数)和ID3DXFileEnumObject::GetChild()(与GetNextDataObject()的作用差不多,但由以前的一个变成了二个函数,参数也不对了)之后其他的基本上就差不多是把IDirectX*****改成ID3DX****,当然还有部分原来的类型被废除了。
    再说下遍历.X文件中的骨骼的函数吧,以《DirectX 角色扮演游戏编程》这书第二章中的.x程序为例
    在9b版本中(部分代码)

    IDirectXFile *pDXFile = NULL;
      IDirectXFileEnumObject *pDXEnum = NULL;
      IDirectXFileData *pDXData = NULL;
      sFrame *Frame;
    … …
    // Allocate a frame that becomes root

      Frame = new sFrame();

      // Loop through all objects looking for the frames and meshes

     while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
        ParseXFileData(pDXData, Frame);
        ReleaseCOM(pDXData);
    }


    到9c版本中则改成(以下为本人在网上收信集资料,自己改的,并不是最好的,但能正常编释运行)

    ID3DXFile *pDXFile = NULL;
        ID3DXFileEnumObject *pDXEnum = NULL;
        ID3DXFileData *pDXData = NULL;
    sFrame *Frame;
    … …

    // allocate a Frame that becomes root

    Frame = new sFrame();
    // Loop through all objects looking for the frames and meshes

    SIZE_T num_child;

    // retrieve the number of children in this file data object

    pDXEnum->GetChildren(&num_child);

    // loop through all objects looking for the frames and meshes

    for(SIZE_T i = 0; i < num_child; i++)
    {
        // retrieves a child object in this file data object

        if(FAILED(pDXEnum->GetChild(i, &pDXData)))
            return NULL;
        // parse pDXFile data

        ParseXFileData(pDXData, Frame);
    ReleaseCOM(pDXData)
    }


    都不知道微软玩什么,看上去只有更复杂,本人还不是很明白升级后有什么优点。
    经过在网上乱逛,本人也只是大致了解这个的一些基本用法,致于性能上的区别还是不懂。先学会用,以后时间长了,用多了,慢慢的就会了解一些的。下面附上《DirectX 角色扮演游戏编程》这书第二章中的.x程序书中的dx9b版及本人修改的dx9c版本,希望对遇到同样问题的朋友有帮助,本代码仅供参考,有错误还请指出…
    阅读(961) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    delete、truncate、drop的区别
    Java闭包
    visio 画网格图
    GPU服务器中了木马病毒
    visio 同时标注上下标
    自动缩放字体
    latex 图片
    多GPU训练
    texstudio 外部查看器错误
    Linux lsof命令详解
  • 原文地址:https://www.cnblogs.com/black/p/5171950.html
Copyright © 2020-2023  润新知