DirectX11 Xファイル スキンメッシュ アニメーション

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
roxas710
記事: 54
登録日時: 5年前

DirectX11 Xファイル スキンメッシュ アニメーション

#1

投稿記事 by roxas710 » 3年前

タイトル通りDirectX11によるスキンメッシュアニメーションについての質問です。

「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 が nullptr でした。」と表示されプログラムが落ちます。
デバッグをずっとしているのですが、pMeshContainer->MeshData.pMesh->CloneMesh(NULL,NULL,pDevice,&pMesh)の行でうまくクローンが作成されていないために、NullPointerで落ちていることが分かりました。

試行錯誤でプログラムにいろいろ追加して、クローン作成時にpMeshに値を入れようとしても値が入りません。。

余計に混乱しているのが、サンプルのプログラムのXファイルなら普通に実行できて、自作のXファイルだとこのエラーが出るということです。
後ほぼ同じのプログラムでDirectX9の本のサンプルプログラムでは実行できて、なぜかDirectX11でのサンプルプログラムだとうまくいかないのもややこしく感じます。


ずっとこのエラーで悩み続けているのですが、もしこのようなエラーやこの分野に精通している方いましたら
参考程度でもいいのでアドバイスをいただきたいです。

“C言語何でも質問掲示板” へ戻る