最後に、テクスチャを貼ってない部分の色を反映させる。
マテリアル構造体に、色を入れる変数を追加する。
色はXMFLOAT4型を使う。
この方はXMVECTOR4と似ているが、単純にfloat型のx,y,z,wをまとめた構造体。
class Fbx
{
//マテリアル
struct MATERIAL
{
Texture* pTexture;
XMFLOAT4 diffuse;
};
テクスチャを貼ってない時だけ色を調べればいい。
//テクスチャ無し
else
{
pMaterialList_[i].pTexture = nullptr;
//マテリアルの色
FbxSurfaceLambert* pMaterial = (FbxSurfaceLambert*)pNode->GetMaterial(i);
FbxDouble3 diffuse = pMaterial->Diffuse;
pMaterialList_[i].diffuse = XMFLOAT4((float)diffuse[0], (float)diffuse[1], (float)diffuse[2], 1.0f);
}
Simple3D.hlslを修正しなければならない。
コンスタントバッファに「マテリアルの色」と「テクスチャを使ってるのどうかフラグ」を追加する。
//───────────────────────────────────────
// コンスタントバッファ
// DirectX 側から送信されてくる、ポリゴン頂点以外の諸情報の定義
//───────────────────────────────────────
cbuffer global
{
float4x4 matWVP; // ワールド・ビュー・プロジェクションの合成行列
float4x4 matW; //ワールド行列
float4 diffuseColor; // ディフューズカラー(マテリアルの色)
bool isTexture; // テクスチャ貼ってあるかどうか
};
あとはピクセルシェーダーの中で、「isTextureがtrueなら今まで通り」「そうでなければテクスチャの色の代わりにdiffuseColor」というように処理を分ければいい。
自分でやってみよう。
Fbx.hのコンスタントバッファ用構造体にメンバを2つ(「色」と「フラグ」)追加する。
Fbxを描画する時に、上記のフラグにtrueかfalseを入れる。
テクスチャを貼って無いなら、Fbxを描画する時に、上記の色の変数に取得した情報を入れる。
これで、Mayaで作った通りに表示されるはず!