テクスチャを貼り付けて光源で照らす

チューブにテクスチャを貼り付けて、光源で照らしながら描画します。

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

プログラムの説明

  1. チューブにテクスチャを貼り付けて、法線ベクトルを設定して、光源で照らしながら描画します。
    Game1.cs を編集して、次の領域を宣言して下さい。
    texture はチューブに貼り付ける画像の領域です。
    pointList[] が頂点座標の配列で、インデックスを使わずに描画します。
    points がチューブの角数で、20以上にするとほぼ円柱になります。
    modelXRotation と modelYRotation はモデルの回転係数を格納する領域です。
    XとYの周期を変えて回転しながら描画します。
    他の領域の説明は ポイントプリミティブの描画 を参照して下さい。
        Texture2D               texture;            // Texture 画像
        BasicEffect             basicEffect;        // 基本エフェクト
        VertexBuffer            vertexBuffer;       // 頂点バッファ
        VertexDeclaration       vertexDeclaration;  // 頂点データの形式
        VertexPositionNormalTexture[] pointList;    // 頂点データの配列
        int                     points = 10;        // 頂点の個数
        float                   modelXRotation = 0.0f; // 回転係数
        float                   modelYRotation = 0.0f; // 回転係数
        
  2. LoadContent() で描画の準備を整えます。
    basicEffect を生成して TextureEnabled と LightingEnabled を true に設定します。
    basicEffect.EnableDefaultLighting() でデフォルトのライトに設定します。
    スペキュラーと2番目と3番目のライトを無効にします。
    DiffuseColor で物質の基本色を設定します。
    basicEffect.View に View 座標を設定します。
    basicEffect.Projection に Projection を設定します。
    InitializeTube() メソッドでチューブ状のモデルを生成します。
    texture に画像を入力して basicEffect.Texture に設定します。
        protected override void LoadContent()
        {
            // エフェクトを作成
            basicEffect = new BasicEffect(GraphicsDevice, null);
    
            // テクスチャーの使用を許可する
            basicEffect.TextureEnabled = true;
    
            // エフェクトでライトを有効にする
            basicEffect.LightingEnabled = true;
    
            // デフォルトのライトの設定を使用する
            basicEffect.EnableDefaultLighting();
    
            // スペキュラーを無効
            basicEffect.SpecularColor = Vector3.Zero;
    
            // 2番目と3番目のライトを無効
            basicEffect.DirectionalLight1.Enabled = false;
            basicEffect.DirectionalLight2.Enabled = false;
    
            // 物質の基本色を設定
            basicEffect.DiffuseColor = new Vector3(1.0f, 1.0f, 0.0f); 
     
            // ビューマトリックスをあらかじめ設定 
            basicEffect.View = Matrix.CreateLookAt(
                    new Vector3(0.0f, 5.0f, 10.0f), Vector3.Zero, Vector3.Up);
    
            // プロジェクションマトリックスをあらかじめ設定
            basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView(
                    MathHelper.ToRadians(45.0f),
                    (float)GraphicsDevice.Viewport.Width / (float)GraphicsDevice.Viewport.Height,
                    1.0f, 100.0f);
            InitializeTube(); 
    
            // テクスチャーの読み込み
            texture = Texture2D.FromFile(graphics.GraphicsDevice, "c:\\data\\test\\Ayu.jpg");
    
            // エフェクトにテクスチャーをセットする
            basicEffect.Texture = texture;
        }
        
  3. InitializeTube() メソッドです。
    「チューブを生成して光源で照らす」ではテクスチャー座標は必要無かったのですが、今回は texture 座標を設定しています。
        private void InitializeTube()
        {
            // 頂点定義データを作成
            vertexDeclaration = new VertexDeclaration(
                GraphicsDevice, VertexPositionNormalTexture.VertexElements);
            pointList = new VertexPositionNormalTexture[points*2]; 
    
            for (int i= 0; i < points; i++) 
            {
                float theta = MathHelper.TwoPi*i / (points-1); 
                pointList[2*i+0] = new VertexPositionNormalTexture( 
                    new Vector3(
                        (float)Math.Sin(theta), -1.5f, (float)Math.Cos(theta)), 
                    new Vector3(
                        (float)Math.Sin(theta), 0.0f, (float)Math.Cos(theta)),
                    new Vector2((float)i/(points-1), 1.0f )); 
                pointList[2*i+1] = new VertexPositionNormalTexture( 
                    new Vector3(
                        (float)Math.Sin(theta), 1.5f, (float)Math.Cos(theta)), 
                    new Vector3(
                        (float)Math.Sin(theta), 0.0f, (float)Math.Cos(theta)),
                    new Vector2((float)i/(points-1), 0.0f )); 
            } 
    
            // 頂点バッファを初期化し、各頂点についてメモリを割り当てます。 
            vertexBuffer = new VertexBuffer(graphics.GraphicsDevice,
                VertexPositionNormalTexture.SizeInBytes * (pointList.Length),
                BufferUsage.None); 
    
            // 頂点の配列に頂点バッファのデータを設定します。 
            vertexBuffer.SetData( pointList ); 
        }
        
  4. Update() メソッドと Draw() メソッドは チューブを生成して光源で照らす を参照して下さい。

【演習】

  1. チューブの色を変えて描画して下さい。
  2. チューブの角数を変えて描画して下さい。
  3. カリングを変更して描画して下さい。

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

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