OBJ Big Normal

Win10 OBJ Big Normal Model

Windows10(Store) DirectX3D で Big OBJ Normal Model を描画します。

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

プログラムの説明

  1. Windows10(Store) で Wavefront のビッグサイズの OBJ モデルを描画します。
    自動生成で構築されるサンプルプロジェクトのモデルは、unsigned shoot(uint16) で参照できるサイズのモデルです。
    今回は頂点データの数が uint16 を超えるビッグサイズの OBJ モデルを描画します。
    ベースとなるプロジェクトは Win10 OBJ Normal Model を参照して下さい。
  2. OBJ モデルは 艦隊これくしょん 摩耶改二 & 鳥海改二 から maya.zip をダウンロードして使わせていただきました。
    今回は「頂点+法線」での描画で、マテリアルは使わないので maya1_0.obj を cube.txt の名前で格納して下さい。
    (名前を変えても良いのですがベースプロジェクトに準じることにします。)
    *.mtl ファイルや画像ファイルは使わないので格納する必要はありません。
  3. Load_OBJ.h の修正です。
    uint16(unsigned short) を uint32(unsigned int) に修正して下さい。
        vector<uint32> m_idxP;      // 頂点 Index の並び(角付)
        vector<uint32> m_idxN;      // 法線 Index の並び(角付)
        vector<uint32> m_idxP3;     // 頂点 Index(3P) の並び
        vector<uint32> m_idxN3;     // 法線 Index(3P) の並び
      
        void PX_P3(vector<uint32> PX, vector<uint32> *P3);
    
  4. Load_OBJ.cpp も uint16(unsigned short) を uint32(unsigned int) に修正します。
    uint16 をインデックスとして使うと「0~65535」の範囲しか参照出来ません。
    ビッグサイズのモデルでは、65535を超えるので注意して下さい。
  5. Sample3DSceneRenderer.cpp の次の行を修正します。
    【修正前】
        context->IASetIndexBuffer(
            m_indexBuffer.Get(),
            DXGI_FORMAT_R16_UINT, //各インデックスは、1 つの 16 ビット符号なし整数 (short) です。
            0
            );
    
    【修正後】
        context->IASetIndexBuffer(
            m_indexBuffer.Get(),
            DXGI_FORMAT_R32_UINT, //各インデックスは、1 つの 32 ビット符号なし整数です。
            0
            );
    
  6. これでビッグサイズのモデルも描画出来るようになります。
    OBJ モデルだけでなく X-FILE でも、頂点データの数が uint16 を超えるビッグサイズの場合は同様です。


maya1_0.obj Big Texture

  1. 艦隊これくしょん 摩耶改二 & 鳥海改二 から maya.zip をダウンロードしました。
    maya1_0.obj はテクスチャを貼り付けたビッグサイズのモデルです。
  2. 少し難しいかも知れませんが、テクスチャを貼り付けて描画してみて下さい。
    Win10 OBJ Multi Texture を参照して、ビッグサイズに対応するように修正します。
  3. プログラムのヒントを差し上げます。
    Index 領域は uint32 で定義します。
        vector<uint32> m_idxP;      // 頂点 Index の並び(角付)
        vector<uint32> m_idxT;      // テクスチャ Index の並び(角付)
        vector<uint32> m_idxP3;     // 頂点 Index(3P) の並び
        vector<uint32> m_idxT3;     // テクスチャ Index(3P) の並び
    
        vector<VertexPosition>  m_Vertex;
        vector<uint32>          m_Index;
    
  4. Sample3DSceneRenderer.cpp の DXGI_FORMAT_R16_UINT を DXGI_FORMAT_R32_UINT に修正します。
        context->IASetIndexBuffer(
            m_indexBuffer.Get(),
            DXGI_FORMAT_R32_UINT, //各インデックスは、1 つの 32 ビット符号なし整数です。
            0
            );
    
  5. maya.zip に格納されている maya1_0.obj を maya1_0.txt の名前で格納します。
    maya1_0.mtl はプロパティからリソースに設定して下さい。
    maya.zip を解凍すると沢山の png ファイルが格納されていますが、これもプロジェクトに加えて下さい。

[Previous Chapter ↑] Win10 OBJ Model

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