分類:[C/C++]
OS Windows 7
Visual Studio 2013
DirectX SDK 2010 June
FBX SDK 2014.1 VS2012
現在、FBXのデータを取り込み、DirectX9で描画するプログラムを書いているのですが、テクスチャの表示で問題が起きています
といいますのは、FBXはテクスチャのUVの情報を直接取得(多分DirectXのUVと同じ)する場合と、インデックスから取得する場合があります。
コードにするとこんな感じです
FbxLayer* layer = pMesh->GetLayer( index );
FbxLayerElementUV* elem = layer->GetUVs();
// UVがあったときのみ次へ
if ( elem != 0 ){
// UVの数・インデックス
int UVNum = elem->GetDirectArray().GetCount();
int indexNum = elem->GetIndexArray().GetCount();
int size = UVNum > indexNum ? UVNum : indexNum;
// マッピングモード・リファレンスモード別にUV取得
FbxLayerElement::EMappingMode mappingMode = elem->GetMappingMode();
FbxLayerElement::EReferenceMode refMode = elem->GetReferenceMode();
// UV配列作成
dataofNode_.numofUVArray = size;
dataofNode_.uvArray = new D3DXVECTOR2[ size ];
if ( mappingMode == FbxLayerElement::eByPolygonVertex ) {
if ( refMode == FbxLayerElement::eDirect ) {
// 直接取得
for ( int j = 0; j < size; ++j ) {
dataofNode_.uvArray[ j ].x = ( float )elem->GetDirectArray().GetAt( j )[ 0 ];
dataofNode_.uvArray[ j ].y = ( float )elem->GetDirectArray().GetAt( j )[ 1 ];
}
}
else
if ( refMode == FbxLayerElement::eIndexToDirect ) {
// インデックスから取得
for ( int j = 0; j < size; ++j ) {
int index = elem->GetIndexArray().GetAt( j );
dataofNode_.uvArray[ j ].x = ( float )elem->GetDirectArray().GetAt( index )[ 0 ];
dataofNode_.uvArray[ j ].y = ( float )elem->GetDirectArray().GetAt( index )[ 1 ];
}
}
}
}
ここでインデックスモードだった場合、このデータを扱ってテクスチャを描画する方法が解らないのです
普通、DirectXでテクスチャを貼る場合はVertexBufferの中に、頂点座標とテクスチャのUV座標と頂点カラ―を入れればいいわけですが、後者のインデックスから取得したデータはテクスチャのUV座標ではないので、このままでは使えません
ということで
1.インデックスのUV座標を頂点のUV座標に変換する
2.インデックス座標を使って描画する
ことが考えられると思うのですが、1の場合は単純な板ポリのような場合は無理やり合わせて出す という荒技が使えますが、何ポリゴンか増えた複雑な形状ではこの手は使えませんし、そもそも変換の法則性を見出すことができませんでした…
2の場合はDirectXにそのような関数があるか探したのですが、残念ながら該当するものを見つけることはできませんでした(探し方が悪いのか本当にないのかあるいはまったく別の方法があるのか解らないのですが…)
まとめると、「FBX形式のデータをDirectXで描画する場合テクスチャの貼り方が解らない」ということになります(ちなみに頂点情報はそのままなのでテクスチャーを貼らない場合は割とあっさり描画できます)
この問題の解決方法に何かお心当たりがございましたら、なにとぞお知恵をお貸し願えないでしょうか?
長々と書いてしまい申し訳ありませんでした
それでは、失礼します
|