Viewer-4

Texture Model

Windows8.1 で X-FILE(頂点座標+法線+テクスチャ)を入力して描画します。
★残念ながら Professional 2013 の試用期限が切れ完成出来ませんでした。
続きは Windows10 File Picker を参照して下さい。

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

概説

  1. Viewer-1 では File Picker から選択した X-FILE(頂点座標+法線)を Sample3DSceneRenderer で描画しました。
    Viewer-2 では Sample3DSceneRenderer を X_Class としてまとめました。
    Viewer-3 では「頂点座標+法線+色」のモデルを描画しました。
    Viewer-4 ではプログラムフォルダーに格納した一般的なテクスチャモデル(テクスチャは一枚)を描画します。
    Microsoft のサンプルプログラムでは、テクスチャ画像のロードに BasicLoader Class の LoadTexture() を使っています。
    BasicLoader は便利な Class なのですが簡単には組み込めません。
    そこで、自作の Texture Class を使うことにします。
    テクスチャ画像の入力に BasicReaderWriter(DirectX の基本入出力)を使っています。
  2. Texture 画像は Material の中で次のように宣言されています。
    今回は使用する画像は一枚だけなので、TextureFilename をキーにして直接取得します。
    色情報などは無視して「頂点座標+法線+テクスチャ」で描画します。
    Material Mat0 {
     1.000000;1.000000;1.000000;1.000000;;
     21.333333;
     0.000000;0.000000;0.000000;;
     0.000000;0.000000;0.000000;;
     TextureFilename {
      "star.jpg";
     }
    }
    
  3. Texture 座標は MeshTextureCoords で次のように定義されます。
    16 は頂点データの個数で、Mesh で定義された頂点座標と対になっています。
     MeshTextureCoords {
      16;
      0.0;0.0;
      1.0;0.0;
      1.0;1.0;
      0.0;1.0;
      0.0;0.0;
      1.0;0.0;
      1.0;1.0;
      0.0;1.0;
      0.0;0.0;
      1.0;0.0;
      1.0;1.0;
      0.0;1.0;
      0.0;1.0;
      0.0;0.0;
      1.0;0.0;
      1.0;1.0;;
     }
    }
    
  4. Texture の設定は色情報と同様に、本来 Face(面)ごとに定義されるのですが、今回は Face 情報は扱いません。
    全ての Face に一枚の Texture が張り付けられ、座標が定義されているものとします。
    X-FILE を解析する主な領域の説明です。
        std::wstring    m_x;                //X-FILE TEXT
        vector<wstring> VT;                 //X-FILE を行で切り分け
        int             VT_size;            //VT の大きさ
        vector<DirectX::XMFLOAT3> m_pos;    // 頂点座標
        vector<DirectX::XMFLOAT3> m_norm;   // 法線ベクトル
        vector<DirectX::XMFLOAT2> m_tex;    // テクスチャ座標
        vector<unsigned short> m_idxP;      // 頂点 Index の並び(角付)
        vector<unsigned short> m_idxN;      // 法線 Index の並び(角付)
        vector<unsigned short> m_idxP3;     // 頂点 Index(3P) の並び
        vector<unsigned short> m_idxN3;     // 法線 Index(3P) の並び   
        String^ m_texName;
        int     m_Line, m_Col, m_Top;
        wstring Word;
    
  5. メソッドの説明です。
  6. Content\ のフォルダに次のファイルを格納して、プロジェクトに加えて下さい。
    TextureLoader, BasicReaderWriter のソースコードは Win10 DirectX Library に掲載しています。
  7. ヘッダーファイルにテクスチャ領域を定義します。
        Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> m_textureSRV;
        Microsoft::WRL::ComPtr<ID3D11SamplerState>  m_sampler;
    
  8. プログラムファイルの修正です。
    ヘッダーを追加します。
    #include "TextureLoader.h"
    
    CreateDeviceDependentResources() の頂点データとインデックスデータの作成が終わった所でテクスチャをロードします。
    "Star.jpg" がロードされて m_textureSRV に設定されます。
        TextureLoader^ loader =
            ref new TextureLoader(m_deviceResources->GetD3DDevice());
        loader->LoadTexture(L"Star.jpg", nullptr, &m_textureSRV );
    
    次に Sampler を設定します。
        // create the sampler
        D3D11_SAMPLER_DESC samplerDesc;
        ZeroMemory(&samplerDesc, sizeof(D3D11_SAMPLER_DESC));
        samplerDesc.Filter = D3D11_FILTER_ANISOTROPIC;
        samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
        samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
        samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
        samplerDesc.MipLODBias = 0.0f;
        samplerDesc.MaxAnisotropy = 2;
        samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
        samplerDesc.BorderColor[0] = 0.0f;
        samplerDesc.BorderColor[1] = 0.0f;
        samplerDesc.BorderColor[2] = 0.0f;
        samplerDesc.BorderColor[3] = 0.0f;
        samplerDesc.MinLOD = 0;
        samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
    
        DX::ThrowIfFailed(
            m_deviceResources->GetD3DDevice()->CreateSamplerState(
                &samplerDesc, &m_sampler) );
    
  9. Render() メソッドでテクスチャを設定します。
    m_textureSRV にはテクスチャ画像が読み込まれています。
        context->PSSetShaderResources(0, 1, m_textureSRV.GetAddressOf());
        context->PSSetSamplers(0, 1, m_sampler.GetAddressOf());
        //※この後に DrawIndexed が続く
        context->DrawIndexed(m_indexCount, 0, 0);
    
  10. InputLayout(頂点データの形式)です。
    	static 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 },
    		{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,    0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    	};
    
  11. シェーダーは[頂点座標+法線+テクスチャ]のものを使用して下さい。
    事前にモデルとテクスチャ画像をフォルダに格納して、プロジェクトに取り込んで下さい。
    モデル(X-FILE)は、プロパティからリソースに設定して下さい。
    テクスチャが設定されていないモデルは描画出来ません。
    X-FILE は普通 Shift_JIS でタイプされています。
    このとき「全角文字(漢字,かな)」が含まれていると、エラーで中断します。
  12. 残念ながら★Professional 2013 の試用期限が切れ完成出来ませんでした。
    続きは Windows10 File Picker を参照して下さい。
    テクスチャの貼り付けは Texture を参照して下さい。

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