質問編集履歴

1 1部を変更

gochuumonha

gochuumonha score 71

2017/03/23 23:06  投稿

OpenGLで表示したときにテクスチャの表示がうまくできない
[こちら](http://nakasis.com/)で配布されているFBXファイルを読み込みOpenGLを使って表示するプログラムを作成しています。(タグにDirectX等を入れさせていただいたのは今回の質問の内容がOpenGLに依存したものではないと考えたからです。)
![イメージ説明](83617c2265755c79934f60b312e315e0.jpeg)
データの1部がマルチテクスチャというか、上の図のオレンジで囲った部分がひとまとまりの頂点配列になっているのですが、ここに使われているテクスチャファイルが2つに分かれていまして、それをどう貼り付けたらよいのかわかりませんので、教えてください。以下に詳しく説明いたします。
https://teratail.com/questions/69684
データ構造は以下のようになっています。(ちなみにglmを使用してます。)
```C++
struct UV
{
   std::vector<vec2> uvList;
};
struct ModelData
{
   std::vector<GLuint> indexList;
   std::vector<vec3> positionList;
   std::vector<vec3> normalList;
   std::vector<UV> uvSet;
};
std::vector<ModelData> modelData;
```
modelDataは大きさ11の配列で以下のように要素を持っています。
```
modelData[0] Node = Kano2_model_chain
       Index Num = 192
       Position Num = 57
       Normal Num = 57
       UV Num = 57    Layer 0
       UV Num = 57    Layer 1
modelData[1] Node = Kano2_model_eyeball
       Index Num = 138
       Position Num = 50
       Normal Num = 50
       UV Num = 50    Layer 0
modelData[2] Node = Kano2_model_outline
       Index Num = 48
       Position Num = 12
       Normal Num = 12
       UV Num = 12    Layer 0
~省略~
modelData[6] Node = Kano2_model_body
       Index Num = 22446
       Position Num = 7750
       Normal Num = 7750
       UV Num = 7750  Layer 0
       UV Num = 7750  Layer 1
~省略~
modelData[10] Node = Kano2_model_hair
       Index Num = 3444
       Position Num = 1331
       Normal Num = 1331
       UV Num = 1331  Layer 0
       UV Num = 1331  Layer 1
```
ここで僕が最も躓いたのはUVが複数あるパーツがあることです。modelData[6]に胴体、腕、手、足、服、靴などのデータが入っています(最初の図で示したオレンジで囲った部分です)。modelDataのそれぞれの要素のうちの1つ目のUV配列を用いて服のテクスチャを表示させると以下のようになりました。
![イメージ説明](4631cb92b8931be9a18dc8e405479786.png)
しかし、当然服のデータしか読み込んでいないので以下に示す本来のデータとは異なります。特にmodelData[6]の足や首、肩回りがおかしくなっています。肌のテクスチャを読み込もうにも、シェーダーでどのように処理すればいいのかわかりません。
![引用:https://twitter.com/nakasis_/status/837249687404978176](47dba7b1afa4be9bb83c5ef0cf43dc80.jpeg)
引用:https://twitter.com/nakasis_/status/837249687404978176
ここでやっと質問なのですが、このテクスチャの間違っている部分に正しいテクスチャを表示するにはどうすればよいのでしょうか?それぞれテクスチャファイルが以下のように分かれているので、張り方がわかりません。
![イメージ説明](ef64703eca2f9bb0ef034a056810c117.png)
このようなデータを扱った経験が少なく複数のUVレイヤーをどう処理したらよいのかまったく見当もつかない状態です。また、最近はゲーム作成ならこんなことしなくてもUnityでできてしまうでしょうから、情報も少なくて困っています。
些細なことでもうれしいのでよろしくお願いいたします。
わかりにくい質問だったので、マルチポストにならないようにこちらにまとめなおしました。
  • C++

    6961 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenGL

    348 questions

    OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

  • GLSL

    88 questions

    GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

  • HLSL

    34 questions

    HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。

  • DirectX

    160 questions

    DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る