Viewer-3

Color Model

Windows8.1 でハードディスク上の X-FILE(頂点座標+法線+色)を入力して描画します。
(この画像は6角大王のページからダウンロードして変換した "C:\DATA\XFILE\gal2.x" です)

前田稔(Maeda Minoru)の超初心者のプログラム入門

概説

  1. Viewer-1 では File Picker から選択した X-FILE(頂点座標+法線)を Sample3DSceneRenderer で描画しました。
    Viewer-2 では Sample3DSceneRenderer を X_Class としてまとめました。
    Viewer-3 では File Picker から選択した「頂点座標+法線+色」のモデルを入力して描画します。
  2. モデルの色は MeshMaterialList と、その中に含まれる Material で定義されます。
    立方体の各面に色を設定したモデルの例です。
    最初の 6; が定義されている Material の数で、次の 6; が Face(面)の数です。
    続く 0, ・・・ 5;; が Face ごとの Index です。
    モデルの色は Face(面またはポリゴン)ごとに設定されます。
    Material { の最初の 1.000000;0.000000;0.000000;1.000000;; がモデルの色です。
    先頭から R(赤)G(緑)B(青)A(輝度) の順で、上の場合は赤色です。
    0.000000;1.000000;0.000000;1.000000;; は緑色です。
    Material(色)が省略されたときは、白に設定します。
     MeshMaterialList {
      6;
      6;
      0,
      1,
      2,
      3,
      4,
      5;;
    
      Material {
       1.000000;0.000000;0.000000;1.000000;;
       21.333333;
       0.000000;0.000000;0.000000;;
       0.000000;0.000000;0.000000;;
      }
      Material {
       0.000000;1.000000;0.000000;1.000000;;
       21.333333;
       0.000000;0.000000;0.000000;;
       0.000000;0.000000;0.000000;;
      }
      Material {
       0.000000;0.000000;1.000000;1.000000;;
       21.333333;
       0.000000;0.000000;0.000000;;
       0.000000;0.000000;0.000000;;
      }
      Material {
       1.000000;1.000000;0.000000;1.000000;;
       21.333333;
       0.000000;0.000000;0.000000;;
       0.000000;0.000000;0.000000;;
      }
      Material {
       0.000000;1.000000;1.000000;1.000000;;
       21.333333;
       0.000000;0.000000;0.000000;;
       0.000000;0.000000;0.000000;;
      }
      Material {
       1.000000;0.000000;1.000000;1.000000;;
       21.333333;
       0.000000;0.000000;0.000000;;
       0.000000;0.000000;0.000000;;
      }
     }
    
  3. Face(面)は Mesh の Index List で定義されます。
    Mesh { 24; が頂点座標の定義で、24個の三次元座標の定義が続きます。
    続く 6; が Face(ポリゴン)の数です。
    4;3,2,1,0;, は四角形ポリゴンで、3,2,1,0 が頂点座標の Index です。
    MeshNormals { から法線ベクトルの定義が始まります。
    法線ベクトルも頂点座標と同じように定義されていて Face の数も構成するポリゴンも同じです。
    MeshNormals は省略されることもあり、そのときはプログラムで計算します。
    Mesh {
     24;
     -1.0;1.0;-1.0;,
     1.0;1.0;-1.0;,
     1.0;1.0;1.0;,
     -1.0;1.0;1.0;,
     -1.0;-1.0;-1.0;,
     1.0;-1.0;-1.0;,
     1.0;-1.0;1.0;,
     -1.0;-1.0;1.0;,
     -1.0;-1.0;1.0;,
     -1.0;-1.0;-1.0;,
     -1.0;1.0;-1.0;,
     -1.0;1.0;1.0;,
     1.0;-1.0;1.0;,
     1.0;-1.0;-1.0;,
     1.0;1.0;-1.0;,
     1.0;1.0;1.0;,
     -1.0;-1.0;-1.0;,
     1.0;-1.0;-1.0;,
     1.0;1.0;-1.0;,
     -1.0;1.0;-1.0;,
     -1.0;-1.0;1.0;,
     1.0;-1.0;1.0;,
     1.0;1.0;1.0;,
     -1.0;1.0;1.0;;
    
     6;
     4;3,2,1,0;,
     4;4,5,6,7;,
     4;11,10,9,8;,
     4;12,13,14,15;,
     4;19,18,17,16;,
     4;20,21,22,23;;
    
  4. Face を管理するために Face 構造体を定義します。
    Num が Face を構成する頂点の数(N角ポリゴン)で、Pos, Norm が Index の並びです。
    Midx が Material(色)を定義するテーブルへの Index です。
    Material が使われていない時は -1 に設定します。
    // Face 構造体
    struct  Face
    {   int         Num;        // 頂点数
        vector<int> Pos;        // 頂点 Index の並び
        vector<int> Norm;       // 法線 Index の並び
        int         Midx;       // Material(MTBL) Index
    };
    vector<Face>    FTBL;       // Face Table
    
    Polygon3 構造体は Face 構造体を3角ポリゴンに変換した構造体です。
    // Polygon3 構造体
    struct  Pol3
    {   int     Pos[3];         // 頂点 Index の並び
        int     Norm[3];        // 法線 Index の並び
        int     Midx;           // Material(MTBL) Index
    };
    vector<Mat>    POL3;        // Polygon3 Table
    
  5. Material(色)を管理するために Material 構造体を定義します。
    matName は Material に付けられた名前で、次に説明します。
    faceColor が Face の色です。 power; specularColor; emissiveColor; は、今回は使いません。
    // Material 構造体
    struct  Mat
    {   string  matName;
        DirectX::XMFLOAT4 faceColor;
        float   power;
        DirectX::XMFLOAT3 specularColor;
        DirectX::XMFLOAT3 emissiveColor;
    };
    vector<Mat>    MTBL;       // Material Table
    

Material の名前

  1. Material は上記のように、MeshMaterialList の中で直接定義される場合と、名前を付けて宣言される場合があります。
    下記の例では Matred の名前で、赤色のマテリアルが宣言されています。
    また a の名前で "test.jpg" をテクスチャとして使用します。
    テクスチャモデルは、次のバージョンを参照して下さい。
    今回は Material をキーにして、先頭から順に MTBL に登録します。
    MeshMaterialList に名前が指定されたときは、MTBL を検索して Index を設定します。
    無名のときは、MTBL の先頭から順に Index を割り当てます。
    名前付と無名を併用すると Index が正しく設定されないことがあるので避けて下さい。
    一般的なモデルでは、どちらかの方法が使われているので、問題なく描画されています。
    Material Matred {
     1.000000;0.000000;0.000000;1.000000;;
     21.333333;
     0.000000;0.000000;0.000000;;
     0.000000;0.000000;0.000000;;
    }
    Material a {
     1.000000;1.000000;1.000000;1.000000;;
     21.333333;
     0.000000;0.000000;0.000000;;
     0.000000;0.000000;0.000000;;
     TextureFilename {
      "test.jpg";
     }
    }
    
  2. Material の定義名を使ったときの MeshMaterialList の例です。
    最初の 5; が定義されている Material の数で、次の 25; が Face(面)の数です。
    続く 0, 1, ・・・ 4;; が Face ごとの Index です。
    {Matpi} などが Material の名前です。
     MeshMaterialList {
      5;
      25;
      0,
      1,
      ・・・
      4,
      4;;
      {Matpi}
      {Matred}
      {Matye}
      {Matbu}
      {Matgre}
     }
    
  3. VertexPosition の定義です。
    struct VertexPosition
    {
        DirectX::XMFLOAT3 pos;
        DirectX::XMFLOAT3 norm;
        DirectX::XMFLOAT4 color;
    };
    
  4. InputLayout(頂点データの形式)です。
        const D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
        {
            { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,  0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
            { "NORMAL",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
            { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
        };
    
  5. シェーダーは[頂点座標+法線+色]のものを使用して下さい。
    File Picker から選択した X-FILE(カラーモデル)が描画出来ることを確かめて下さい。
    色が設定されていないモデルも描画出来るので試して下さい。
    X-FILE は普通 Shift_JIS でタイプされています。
    このとき「全角文字(漢字,かな)」が含まれていると、エラーで中断します。

X-FILE Viewew

  1. X-FILE を解析する主な領域です。
        vector<DirectX::XMFLOAT3> m_pos;
        vector<DirectX::XMFLOAT3> m_norm;
    
        vector<Face>    FTBL;   // Face Table
        vector<Pol3>    POL3;   // Polygon3 Table
        vector<Mat>     MTBL;   // Material Table
    
  2. メソッドの説明です。

超初心者のプログラム入門(DirectX Store)