游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2009|回复: 6

SkinnedMesh

[复制链接]

16

主题

59

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2010-4-26 07:04:00 | 显示全部楼层 |阅读模式
[em24]
看了一下DirectX SDK SkinnedMesh的实例 试图把他封装成自己的类 但是在D3DXCreateEffectFromFile这一句总是过不去 还是不太明白实例里HRESULT CALLBACK OnCreateDevice 函数里只用了CAllocateHierarchy Alloc 而CAllocateHierarchy 这个类里的函数是怎么调用的 是和CALLBACK 有关吗?

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2010-4-26 09:28:00 | 显示全部楼层

Re:SkinnedMesh

一个回调函数,获取骨骼层级

16

主题

59

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2010-4-26 20:20:00 | 显示全部楼层

Re:SkinnedMesh

能再详细一下吗 我自己也在网上看了一下回调函数 但是还是不太理解 感觉我的Alloc 里面的函数没有调用啊

这是我的代码
#ifndef __MyAllocHierarchyH__
#define __MyAllocHierarchyH__

#include <d3dx9.h>
#include "d3dUtility.h"

// enum for various skinning modes possible
enum METHOD
{
    D3DNONINDEXED,
    D3DINDEXED,
    SOFTWARE,
    D3DINDEXEDVS,
    D3DINDEXEDHLSLVS,
    NONE
};

//--------------------------------------------------------------------------------------
// Name: struct D3DXFRAME_DERIVED
// Desc: Structure derived from D3DXFRAME so we can add some app-specific
//       info that will be stored with each frame
//--------------------------------------------------------------------------------------
struct D3DXFRAME_DERIVED : public D3DXFRAME
{
    D3DXMATRIXA16 CombinedTransformationMatrix;
};


//--------------------------------------------------------------------------------------
// Name: struct D3DXMESHCONTAINER_DERIVED
// Desc: Structure derived from D3DXMESHCONTAINER so we can add some app-specific
//       info that will be stored with each mesh
//--------------------------------------------------------------------------------------
struct D3DXMESHCONTAINER_DERIVED : public D3DXMESHCONTAINER
{
    LPDIRECT3DTEXTURE9* ppTextures;       // array of textures, entries are NULL if no texture specified   

    // SkinMesh info            
    LPD3DXMESH pOrigMesh;
    LPD3DXATTRIBUTERANGE pAttributeTable;
    DWORD NumAttributeGroups;
    DWORD NumInfl;
    LPD3DXBUFFER pBoneCombinationBuf;
    D3DXMATRIX** ppBoneMatrixPtrs;
    D3DXMATRIX* pBoneOffsetMatrices;
    DWORD NumPaletteEntries;
    bool UseSoftwareVP;
    DWORD iAttributeSW;     // used to denote the split between SW and HW if necessary for non-indexed skinning
};

//--------------------------------------------------------------------------------------
// Name: class CAllocateHierarchy
// Desc: Custom version of ID3DXAllocateHierarchy with custom methods to create
//       frames and meshcontainers.
//--------------------------------------------------------------------------------------
class MyAllocHierarchy : public ID3DXAllocateHierarchy
{
public:

        bool                                bUseSoftwareVP;                         // Flag to indicate whether software vp is
        METHOD                                SkinningMethod;                        // Current skinning method
        UINT                NumBoneMatricesMax;
        D3DXMATRIXA16*      pBoneMatrices;

    STDMETHOD (CreateFrame) ( THIS_ LPCSTR Name, LPD3DXFRAME *ppNewFrame );

    #if (D3D_SDK_VERSION &31)        //Here is for Directx9.0b
    STDMETHOD(CreateMeshContainer)(THIS_ LPCTSTR Name,
                                                        LPD3DXMESHDATA pMeshData,
                            LPD3DXMATERIAL pMaterials,
                                                        LPD3DXEFFECTINSTANCE pEffectInstances,
                                                        DWORD NumMaterials,
                            DWORD *pAdjacency, LPD3DXSKININFO pSkinInfo,
                            LPD3DXMESHCONTAINER *ppNewMeshContainer);
        #else                                                //Here is for Directx9.0c
    STDMETHOD(CreateMeshContainer)(
                THIS_ LPCSTR Name,
        CONST D3DXMESHDATA *pMeshData,
        CONST D3DXMATERIAL *pMaterials,
        CONST D3DXEFFECTINSTANCE *pEffectInstances,
        DWORD NumMaterials,
        CONST DWORD *pAdjacency,
        LPD3DXSKININFO pSkinInfo,
        LPD3DXMESHCONTAINER *ppNewMeshContainer);
        #endif

    STDMETHOD (DestroyFrame) ( THIS_ LPD3DXFRAME pFrameToFree );//HRESULT STDMETHODCALLTYPE   STDMETHODIMP
        STDMETHOD (DestroyMeshContainer) ( THIS_ LPD3DXMESHCONTAINER pMeshContainerBase );

        MyAllocHierarchy()
        {
                SkinningMethod = SOFTWARE;
        }

        HRESULT GenerateSkinnedMesh( IDirect3DDevice9* pd3dDevice, D3DXMESHCONTAINER_DERIVED* pMeshContainer );
        HRESULT AllocateName( LPCSTR Name, LPSTR* pNewName );

};

#endif

0

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2010-4-28 14:55:00 | 显示全部楼层

Re: SkinnedMesh

其实你不需要封装ID3DXAllocateHierarchy,只要在派生中实现这个接口的四个方法,然后传递一个派生类型的对象到D3DXLoadMeshhierarchyfromX

16

主题

59

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2010-4-30 21:28:00 | 显示全部楼层

Re:SkinnedMesh

恩 现在D3DXLoadMeshhierarchyfromX这个函数已经过去了 但是会卡在
D3DXMatrixMultiply(
                    &pBoneMatrices[iBone],                 // output
                    &pMeshContainer->pBoneOffsetMatrices[iBone],
                    pMeshContainer->ppBoneMatrixPtrs[iBone]
                    );
怀疑是封装后ppBoneMatrixPtrs[iBone]里面的值没有存进去。。。

16

主题

59

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2010-4-30 22:03:00 | 显示全部楼层

Re:SkinnedMesh

D3DXMESHCONTAINER_DERIVED里的ppBoneMatrixPtrs
不太明白他是怎么传递D3DXMESHCONTAINER_DERIVED里的ppBoneMatrixPtrs信息的
因为他函数传递的都是_D3DXMESHCONTAINER这个结构 然后D3DXMESHCONTAINER_DERIVED* pMeshContainer = ( D3DXMESHCONTAINER_DERIVED* )pMeshContainerBase;但这样的话D3DXMESHCONTAINER_DERIVED里的ppBoneMatrixPtrs信息不实丢失了吗

是因为他源程序里更新和渲染都是CALLBACK函数的原因吗?

16

主题

59

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2010-5-2 23:41:00 | 显示全部楼层

Re:SkinnedMesh

解决了!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 19:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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