矩形にテクスチャーを貼り付ける

浜崎あゆみの画像を次の二通りの方法で貼り付けます。
1.一個の矩形(二個の三角形)に、あゆの画像を「二列、三行」で貼り付けます。
2,一枚の画像を二個の矩形(四個の三角形)をまたいで、一枚の写真のように貼り付けます。
カリングと座標系の説明は 前田稔の超初心者のプログラム入門 から DirectX9 講座を参照して下さい。

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

プログラムの説明

  1. 左側に表示した一枚の矩形に、テクスチャーをタイルのように「二列、三行」で貼り付けます。
    右側に表示した二枚の矩形をまたいで、一枚のテクスチャーを貼り付けます。
    テクスチャーとして貼り付ける画像ファイルをプロジェクトの Content のフォルダーに格納して下さい。
    詳細は 画像をリソースとして組み込む を参照して下さい。
  2. Game1.cs を編集して、次の領域を宣言して下さい。
    vertexDeclaration は頂点座標の形式を定義する領域です。
    basicEffect1, vertexBuffer1 は左側の矩形用で、basicEffect2, vertexBuffer2 は右側の矩形用です。
    他の領域の説明は テクスチャーの基本 を参照して下さい。
        GraphicsDeviceManager graphics; 
        Texture2D           texture;
        VertexDeclaration   vertexDeclaration; 
        BasicEffect         basicEffect1; 
        BasicEffect         basicEffect2; 
        VertexBuffer        vertexBuffer1; 
        VertexBuffer        vertexBuffer2; 
        
  3. LoadContent() で左右の矩形を定義して、テクスチャー座標を設定して、描画の準備を整えます。
    vertexDeclaration に頂点データの形式(VertexPositionTexture)を設定します。
    左右の basicEffect を生成して TextureEnabled を true に設定します。
    矩形の頂点座標とテクスチャー座標を定義する vertices1[] を用意します。
    vertices1[] の矩形は、画面中央から左に寄せて配置します。
    テクスチャー座標が (0.0f, 0.0f)〜(2.0f, 3.0f) に設定されていることに注目して下さい。
    左側の画像のように Ayu の画像が「横方向に二枚、縦方向に三枚並べて」タイルのように貼り付けられます。
    texture に画像(Ayu.jpg)を入力して Texture に設定します。
    矩形の頂点座標とテクスチャー座標を定義する vertices2[] を用意します。
    vertices2[] は左右に並んだ二枚の矩形で、画面中央から右に寄せて配置します。
    中央のテクスチャー座標が (0.5f, 0.0f) (0.5f, 1.0f) に設定されていることに注目して下さい。
    一枚のテクスチャーを中央で分けて貼り付けています。
        protected override void LoadContent()
        {
            // 頂点定義データを作成
            vertexDeclaration = new VertexDeclaration(
                GraphicsDevice, VertexPositionTexture.VertexElements);
    
            // エフェクトを作成
            basicEffect1 = new BasicEffect(GraphicsDevice, null);
            basicEffect2 = new BasicEffect(GraphicsDevice, null);
    
            // テクスチャーの使用を許可する
            basicEffect1.TextureEnabled = true;
    
            // ビューマトリックスをあらかじめ設定
            basicEffect1.View = Matrix.CreateLookAt(
                    new Vector3(0.0f, 0.0f, 5.0f), Vector3.Zero, Vector3.Up);
    
            // プロジェクションマトリックスをあらかじめ設定
            basicEffect1.Projection = Matrix.CreatePerspectiveFieldOfView(
                    MathHelper.ToRadians(45.0f),
                    (float)GraphicsDevice.Viewport.Width / (float)GraphicsDevice.Viewport.Height,
                    1.0f, 100.0f);
    
            // 頂点データを作成する
            VertexPositionTexture[] vertices1 = new VertexPositionTexture[4];
            vertices1[0] = new VertexPositionTexture(new Vector3(-2.2f, 1.0f, 0.0f), new Vector2(0.0f, 0.0f));
            vertices1[1] = new VertexPositionTexture(new Vector3(-0.2f, 1.0f, 0.0f), new Vector2(2.0f, 0.0f));
            vertices1[2] = new VertexPositionTexture(new Vector3(-2.2f, -1.0f, 0.0f), new Vector2(0.0f, 3.0f));
            vertices1[3] = new VertexPositionTexture(new Vector3(-0.2f, -1.0f, 0.0f), new Vector2(2.0f, 3.0f));
    
            // 頂点バッファ作成
            vertexBuffer1 = new VertexBuffer(GraphicsDevice,
                VertexPositionTexture.SizeInBytes * 4, BufferUsage.None);
    
            // 頂点データを頂点バッファに書き込む
            vertexBuffer1.SetData(vertices1);
    
            // テクスチャーの読み込み
            //texture = Texture2D.FromFile(graphics.GraphicsDevice, "c:\\data\\test\\Ayu.jpg");
            texture = Content.Load("Ayu");
    
            // エフェクトにテクスチャーをセットする
            basicEffect1.Texture = texture;
            basicEffect2 = basicEffect1;
    
            // 二個目の矩形を作成する
            VertexPositionTexture[] vertices2 = new VertexPositionTexture[6];
            vertices2[0] = new VertexPositionTexture(new Vector3(2.0f, 1.0f, 0.0f), new Vector2(1.0f, 0.0f));
            vertices2[1] = new VertexPositionTexture(new Vector3(2.0f, -1.0f, 0.0f), new Vector2(1.0f, 1.0f));
            vertices2[2] = new VertexPositionTexture(new Vector3(1.0f, 1.0f, 0.0f), new Vector2(0.5f, 0.0f));
            vertices2[3] = new VertexPositionTexture(new Vector3(1.0f, -1.0f, 0.0f), new Vector2(0.5f, 1.0f));
            vertices2[4] = new VertexPositionTexture(new Vector3(0.0f, 1.0f, 0.0f), new Vector2(0.0f, 0.0f));
            vertices2[5] = new VertexPositionTexture(new Vector3(0.0f, -1.0f, 0.0f), new Vector2(0.0f, 1.0f));
    
            // 頂点バッファ作成
            vertexBuffer2 = new VertexBuffer(GraphicsDevice,
                VertexPositionTexture.SizeInBytes * 6, BufferUsage.None);
    
            // 頂点データを頂点バッファに書き込む
            vertexBuffer2.SetData(vertices2);
        }
        
  4. Draw() メソッドでテクスチャーを貼り付けた左右の矩形を描画します。
    GraphicsDevice.VertexDeclaration に頂点データの形式を設定します。
    vertexBuffer1, basicEffect1 で左側の矩形を描画します。
    続いて vertexBuffer2, basicEffect2 で右側の矩形を描画します。
        protected override void Draw(GameTime gameTime)
        {
            // 画面を指定した色でクリアします
            GraphicsDevice.Clear(Color.CornflowerBlue);
    
            // 描画する頂点データの定義を設定
            GraphicsDevice.VertexDeclaration = vertexDeclaration;
    
            // 一個目の矩形を描画
            GraphicsDevice.Vertices[0].SetSource(
                vertexBuffer1, 0, VertexPositionTexture.SizeInBytes);
    
            // エフェクトの使用を開始します
            basicEffect1.Begin();
            // パスの数だけ繰り替えし描画
            foreach (EffectPass pass in basicEffect1.CurrentTechnique.Passes)
            {
                // パスの開始
                pass.Begin();
                // ポリゴン描画する
                GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
                // パスの終了
                pass.End();
            }
            // エフェクトの使用を終了する
            basicEffect1.End();
    
            // 二個目の矩形を描画
            GraphicsDevice.Vertices[0].SetSource(
                vertexBuffer2, 0, VertexPositionTexture.SizeInBytes);
    
            // エフェクトの使用を開始します
            basicEffect2.Begin();
            // パスの数だけ繰り替えし描画
            foreach (EffectPass pass in basicEffect2.CurrentTechnique.Passes)
            {
                // パスの開始
                pass.Begin();
                // ポリゴン描画する
                GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 4);
                // パスの終了
                pass.End();
            }
            // エフェクトの使用を終了する
            basicEffect2.End();
    
            // 登録された DrawableGameComponent を描画する
            base.Draw(gameTime);
        }
        

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

超初心者のプログラム入門(XNA(C#) game program)