C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

FBXのデータをDirectXで描画するときのテクスチャ


(過去ログ 121 を表示中)

[トピック内 1 記事 (1 - 1 表示)]  << 0 >>

■72278 / inTopicNo.1)  FBXのデータをDirectXで描画するときのテクスチャ
  
□投稿者/ OROCHI (34回)-(2014/05/31(Sat) 20:05:16)

分類:[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で描画する場合テクスチャの貼り方が解らない」ということになります(ちなみに頂点情報はそのままなのでテクスチャーを貼らない場合は割とあっさり描画できます)

この問題の解決方法に何かお心当たりがございましたら、なにとぞお知恵をお貸し願えないでしょうか?
長々と書いてしまい申し訳ありませんでした

それでは、失礼します

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -