XLoader Texture3

XLoader Texture3

Windows10 の XLoader で2種類以上のテクスチャを貼り付けます。

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

XLoader Color Model

  1. 「頂点+法線+テクスチャ+色」モデルの描画は XLoader TexColor を参照して下さい。
    今回は2種類以上のテクスチャを貼り付けたモデルを描画します。
    OBJ Model で同様のプロジェクト Win10 OBJ Multi Texture を作成しています。
    XLoader を組み込むと修正するのは XLoader Class とシェーダ関係だけですが、テクスチャが良く見えるように回転軸を修正するので Model.cpp も少しさわります。
    Y軸だけでなく、X軸も同時に回転しながら描画します。
    詳細は Win10 Rotate を参照して下さい。
        XMMATRIX    ry,rz,mat;
        XMFLOAT4X4  f4x4;
        ry = XMMatrixRotationY(radians);
        rz = XMMatrixRotationZ(radians);
        mat = ry * rz;
        XMStoreFloat4x4(&f4x4, mat);
        m_constantBufferData.model = f4x4;
    
  2. シェーダーは Windows10 Shader から「頂点+法線+テクスチャ+4色」に対応した物を使って下さい。
    モデルの色とテクスチャはポリゴン毎に Material で共に定義されています。
    テクスチャは Win10 two Texture で説明しているように描画時に context->PSSetShaderResources() で切り替えます。
    そこで頂点データを作成するときにテクスチャの種類ごとに集めて格納します。
    テクスチャが張り付けられていないポリゴンは、白のテクスチャ(white.jpg)として処理します。
    テクスチャモードでレンダリングするとテクスチャの色とベースの色がブレンドされるからです。
    (テクスチャ座標を 0.0f-0.0f に設定してもブレンドされるようです)
    テクスチャの種類ごとに描画する Texture 構造体です。
    textureView が設定するテクスチャです。
    Offset が現在のテクスチャを使って描画する頂点データの開始位置で Num がその個数です。
    // Texture 構造体(TTBL)
    struct  Stex
    {   string  texName;
        Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> textureView;
        int     Offset;     // 描画開始 Offset
        int     Num;        // 描画数 Index
    };
    
    Texture 構造体に従ってポリゴンを描画するソースコードです。
        // ピクセル シェーダーをアタッチします。
        context->PSSetShader(m_pixelShader.Get(), nullptr, 0);
        context->PSSetSamplers(0, 1, m_sampler.GetAddressOf());
    
        // オブジェクトを描画します。
        for(unsigned k=0; k<TTBL.size(); k++)
        {
            context->PSSetShaderResources(0, 1, TTBL[k].textureView.GetAddressOf());
            context->DrawIndexed(TTBL[k].Num, TTBL[k].Offset, 0);
        }
    
  3. テクスチャの種類ごとに集めて頂点データを作成するソースコードです。
    for(k=0; k<(int)TTBL.size(); k++) で Texture 構造体を順にポイントします。
    if (POL3[i].Tidx == k) で k 番目のテクスチャが使われている物を抜き出します。
            //★ pos, norm, tex,color を組み合わせて、モデルの頂点座標を作成
            m_indexCount = POL3.size() * 3;
            VertexPosition *Vertices = new VertexPosition[m_indexCount];
            unsigned short *Indices = new unsigned short[m_indexCount];
    
            // Texture 毎にまとめて Vertices[] に格納する
            int         idx,pt,n;
            unsigned    i,k;
            pt= 0;
            n= 0;
            for(k=0; k<TTBL.size(); k++)
            {   TTBL[k].Offset= pt;
                for(i=0; i<POL3.size(); i++)
                {
                    if (POL3[i].Tidx == k)
                    {
                        // 頂点座標
                        Vertices[n].pos = m_pos[POL3[i].Pos[0]];
                        Vertices[n + 1].pos = m_pos[POL3[i].Pos[1]];
                        Vertices[n + 2].pos = m_pos[POL3[i].Pos[2]];
                        // 法線ベクトル(未設定のときはプログラムで計算)
                        if (m_normflag)
                        {
                            Vertices[n].norm = m_norm[POL3[i].Norm[0]];
                            Vertices[n + 1].norm = m_norm[POL3[i].Norm[1]];
                            Vertices[n + 2].norm = m_norm[POL3[i].Norm[2]];
                        }
    
                        // マテリアルの規定値を設定
                        Vertices[n].tex.x = 0.0f;
                        Vertices[n].tex.y = 0.0f;
                        Vertices[n + 1].tex = Vertices[n].tex;
                        Vertices[n + 2].tex = Vertices[n].tex;
                        Vertices[n].color.x = 1.0f;
                        Vertices[n].color.y = 1.0f;
                        Vertices[n].color.z = 1.0f;
                        Vertices[n].color.w = 1.0f;
                        Vertices[n + 1].color = Vertices[n].color;
                        Vertices[n + 2].color = Vertices[n].color;
    
                        // テクスチャ座標が設定されているとき
                        idx = POL3[i].Midx;
                        if (m_texflag && (idx != -1) && (POL3[i].Tidx > 0))
                        {
                            Vertices[n].tex = m_tex[POL3[i].Pos[0]];
                            Vertices[n + 1].tex = m_tex[POL3[i].Pos[1]];
                            Vertices[n + 2].tex = m_tex[POL3[i].Pos[2]];
                        }
                        // マテリアル(色)の設定(idx==-1 のときは未設定)
                        if (idx != -1)
                        {
                            Vertices[n].color = MTBL[idx].faceColor;
                            Vertices[n + 1].color = MTBL[idx].faceColor;
                            Vertices[n + 2].color = MTBL[idx].faceColor;
                        }
                        Indices[i * 3] = i * 3;
                        Indices[i * 3 + 1] = i * 3 + 1;
                        Indices[i * 3 + 2] = i * 3 + 2;
                        pt += 3;
                        n += 3;
                        TTBL[k].Num = pt - TTBL[k].Offset;
                    }
                }
            }
    
  4. BoxP3Tex.x を X Model からダウンロードしてプロジェクトに追加して下さい。
    プログラムを実行すると立方体の各面に3種類のテクスチャが張り付けられて描画されます。
    テクスチャは white.jpg, star.jpg, kishi.jpg, test.jpg の4枚の画像を使っています。
    char.x はテクスチャを張り付けたポリゴンとテクスチャ無しで色を設定したポリゴンを使い分けています。
    テクスチャ無しのポリゴンを描画するときは、全体が白色の画像をテクスチャとして張り付けます。
    char.x の描画には苦労したのですが、やっとこのプロジェクトで描画することが出来たので試してみて下さい。

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