「DirectX11 必携」のサンプルを手本にスキンメッシュを実装しようとしているのですが、
この書籍のサンプルについているXファイルならちゃんと読み込んで、プログラムを実行することができるのですが
自分で作ったXファイルでサンプルを実行してみると、エラーが発生してプログラム自体が起動せず落ちてしまいます。
使用している環境は、Blenderでアニメーション付きのデータをXファイルにエクスポートして使っています。
同じ人が書いてある「DirectX9 必携」でのスキンメッシュのサンプルでは上記の方法でうまく動作します。
Xファイルを読み込むパーサーもDirectX9とDirectX11ではさほど大きな変更はないとみているのですが、
同じXファイルなのにDirectX9とDirectX11の差で実行できないのはおかしいなと思っています。
「DirectX11 必携」のサンプルでエラーを吐いているサンプルプログラムの一部を載せます。
//メッシュコンテナーを作成する
HRESULT MY_HIERARCHY::CreateMeshContainer(LPCSTR Name, CONST D3DXMESHDATA* pMeshData,
CONST D3DXMATERIAL* pMaterials, CONST D3DXEFFECTINSTANCE* pEffectInstances,
DWORD NumMaterials, CONST DWORD *pAdjacency, LPD3DXSKININFO pSkinInfo,
LPD3DXMESHCONTAINER *ppMeshContainer)
{
*ppMeshContainer = NULL;
DWORD dwBoneNum=0;
MYMESHCONTAINER *pMeshContainer = new MYMESHCONTAINER;
ZeroMemory(pMeshContainer, sizeof(MYMESHCONTAINER));
pMeshContainer->Name=new CHAR[strlen(Name) + 1];
strcpy(pMeshContainer->Name,Name);
memcpy(&pMeshContainer->MeshData,pMeshData,sizeof(pMeshContainer->MeshData));
pMeshContainer->MeshData.Type = D3DXMESHTYPE_MESH;
int NumPoly=pMeshContainer->MeshData.pMesh->GetNumFaces();
//メッシュを複製する。 なぜかスキンメッシュだと、この関数を抜けた直後にD3DX内部でメッシュポインターがおかしくなってしまうので。
LPDIRECT3DDEVICE9 pDevice=NULL;
pMeshContainer->MeshData.pMesh->GetDevice(&pDevice);
LPD3DXMESH pMesh=NULL;
!pMeshContainer->MeshData.pMesh->CloneMesh(NULL,NULL,pDevice,&pMesh);
//SAFE_RELEASE(pMeshContainer->MeshData.pMesh);
pMeshContainer->MeshData.pMesh=pMesh;
//メッシュのマテリアル設定
pMeshContainer->NumMaterials = max(1, NumMaterials);
pMeshContainer->pMaterials = new D3DXMATERIAL[pMeshContainer->NumMaterials];
!pMeshContainer->pAdjacency = new DWORD[pMeshContainer->MeshData.pMesh->GetNumFaces()*3]; //ここでプログラムが落ちる!!!
if ((pMeshContainer->pAdjacency == NULL) || (pMeshContainer->pMaterials == NULL))
{
return E_FAIL;
}
・・・
デバッグをずっとしているのですが、pMeshContainer->MeshData.pMesh->CloneMesh(NULL,NULL,pDevice,&pMesh)の行でうまくクローンが作成されていないために、NullPointerで落ちていることが分かりました。
試行錯誤でプログラムにいろいろ追加して、クローン作成時にpMeshに値を入れようとしても値が入りません。。
余計に混乱しているのが、サンプルのプログラムのXファイルなら普通に実行できて、自作のXファイルだとこのエラーが出るということです。
後ほぼ同じのプログラムでDirectX9の本のサンプルプログラムでは実行できて、なぜかDirectX11でのサンプルプログラムだとうまくいかないのもややこしく感じます。
ずっとこのエラーで悩み続けているのですが、もしこのようなエラーやこの分野に精通している方いましたら
参考程度でもいいのでアドバイスをいただきたいです。