Υλικά BasicEffect

Σελίδα ενημέρωση :
Ημερομηνία δημιουργίας σελίδας :

περίληψη

Χειριστείτε τις παραμέτρους που σχετίζονται με το υλικό μέρος του BasicEffect για να δείτε πώς φαίνεται το μοντέλο.

Περιβάλλον λειτουργίας

Προϋποθέσεις

Υποστηριζόμενες εκδόσεις XNA
  • 4.0
Υποστηριζόμενες πλατφόρμες
  • Windows (XP SP2 ή νεότερη έκδοση, Vista, 7)
  • Κονσόλα Xbox 360
  • Windows Phone 7
Windows Απαιτούμενη έκδοση σκίασης Vertex 2.0
Απαιτούμενη έκδοση Pixel Shader των Windows 2.0

Περιβάλλον λειτουργίας

πλατφόρμα
  • Τα Windows 7
  • Κονσόλα Xbox 360
  • Windows Phone 7

Πώς να εργαστείτε με το δείγμα

Λειτουργεί πληκτρολόγιοΧειριστήριο Xbox 360αφή ποντικιού
Επιλέξτε τις παραμέτρους που θέλετε να αλλάξετε ↑、↓ Αριστερός μοχλός ↑, ↓ Αριστερό κουμπί -
Αλλαγή παραμέτρων ←、→ Αριστερός μοχλός ←, → ←→ Σύρετε -

ουσία

Τι είναι το BasicEffect;

Στο XNA, εάν θέλετε να εμφανίσετε 3D πολύγωνα, πρέπει να γράψετε ένα πρόγραμμα σκίασης για να τα σχεδιάσετε και να αποφασίσετε πώς να τα σχεδιάσετε. Για να το κάνετε αυτό, δημιουργήστε ένα ξεχωριστό αρχείο εφέ, γράψτε ένα πρόγραμμα, διαβάστε το ως κλάση εφέ (Effect) και εκτελέστε το πρόγραμμα σκίασης.

Ωστόσο, υπάρχουν πολλές περιπτώσεις όπου δεν χρειάζεστε ειδικό εφέ σχεδίασης, και ακόμη και σε τέτοιες περιπτώσεις, είναι απαραίτητο ένα εφέ, οπότε είναι εκπληκτικά δυσκίνητο να ασχοληθείτε με την εφαρμογή ενός προγράμματος σκίασης.

Επομένως, βασικές παράμετροι όπως τα υλικά και τα φώτα προετοιμάζονται ως ιδιότητες εκ των προτέρων, έτσι ώστε τα εφέ να μπορούν εύκολα να αντιμετωπιστούν "BasicEffect". Είναι πολύ εύκολο γιατί δεν χρειάζεται να δημιουργήσετε ένα αρχείο εφέ, μπορείτε να το χειριστείτε απλά δημιουργώντας μια παρουσία της κλάσης.

Ακόμα κι αν φορτώσετε δεδομένα μοντέλου από το περιεχόμενο, το BasicEffect ορίζεται από προεπιλογή, επομένως δεν χρειάζεται καν να δημιουργήσετε μια παρουσία.

υλικός

Το υλικό αναφέρεται κυρίως στα χαρακτηριστικά του υλικού μιας ουσίας και χρησιμοποιείται για τον προσδιορισμό του χρώματος, του βαθμού αντανάκλασης και της αντοχής της ουσίας. Δεδομένου ότι έχει καταστεί δυνατή η ανεξάρτητη εξέφρασή του σε προγράμματα σκίασης, ο ορισμός ενός υλικού μπορεί να έχει μια τραχιά έννοια χωρίς να είναι σταθερός, αλλά το BasicEffect έχει τις ακόλουθες παραμέτρους:

Άλφα Αδιαφάνεια. Η τιμή 1,0 υποδεικνύει αδιαφάνεια και η τιμή 0,0 αντιπροσωπεύει πλήρη διαφάνεια.
ΔιάχυτοΧρώμα Το χρώμα της ουσίας του αντικειμένου που θα εμφανιστεί. Αναπαραστήστε χρώματα σε RGB. Η σκίαση του υλικού αντανακλάται ανάλογα με την κατάσταση του φωτός.
EmissiveColor Το εκπεμπόμενο χρώμα του αντικειμένου που θα εμφανιστεί. Αναπαραστήστε χρώματα σε RGB. Δεδομένου ότι είναι ένα χρώμα που εκπέμπει το δικό του φως, το χρώμα προστίθεται χωρίς να επηρεάζεται από το φως.
SpecularColor Το χρώμα της αντανάκλασης του αντικειμένου που θα εμφανιστεί. Αναπαραστήστε χρώματα σε RGB. Ανάλογα με την κατεύθυνση και την άποψη του φωτός, το υλικό θα φαίνεται να αντανακλάται.
Κατοπτρική δύναμη Η ένταση της αντανάκλασης του αντικειμένου που πρόκειται να εμφανιστεί. Όσο υψηλότερη είναι η τιμή, τόσο μικρότερη είναι η περιοχή που αντικατοπτρίζεται.

Εικόνα ουσιώδους αλλαγής

Η παρακάτω εικόνα δείχνει τις διαφορετικές τιμές του υλικού.

Αρχική κατάσταση

Αυτή είναι η κατάσταση αμέσως μετά τη φόρτωση των δεδομένων του δείγματος μοντέλου.

初期状態

Άλφα 1
Διάχυτο (κόκκινο) 0.8
Διάχυτο (πράσινο) 0.8
Διάχυτο (μπλε) 0
Emissive (Κόκκινο) 0
Emissive (Πράσινο) 0
Emissive (Μπλε) 0
Κατοπτρισμός (Κόκκινο) 0
Κατοπτρισμός (Πράσινο) 0
Κατοπτρισμός (Μπλε) 0
Κατοπτρική δύναμη 5

Αλλαγή αδιαφάνειας (Alpha)

Αυτό συμβαίνει όταν αλλάζετε την αδιαφάνεια. Το μπλε χρώμα του φόντου είναι αχνά ορατό.

不透明度(Alpha)変更

Άλφα 0.31
Διάχυτο (κόκκινο) 0.8
Διάχυτο (πράσινο) 0.8
Διάχυτο (μπλε) 0
Emissive (Κόκκινο) 0
Emissive (Πράσινο) 0
Emissive (Μπλε) 0
Κατοπτρισμός (Κόκκινο) 0
Κατοπτρισμός (Πράσινο) 0
Κατοπτρισμός (Μπλε) 0
Κατοπτρική δύναμη 5

Διάχυτες τροποποιήσεις

Το χρώμα της ουσίας αλλάζει για να γίνει μπλε.

Diffuse 変更

Άλφα 1
Διάχυτο (κόκκινο) 0.05
Διάχυτο (πράσινο) 0.71
Διάχυτο (μπλε) 1
Emissive (Κόκκινο) 0
Emissive (Πράσινο) 0
Emissive (Μπλε) 0
Κατοπτρισμός (Κόκκινο) 0
Κατοπτρισμός (Πράσινο) 0
Κατοπτρισμός (Μπλε) 0
Κατοπτρική δύναμη 5

Τροποποιήσεις εκπομπής

Τα κόκκινα και μπλε στοιχεία του Emissive μεγιστοποιούνται. Ανεξάρτητα από την κατάσταση του φωτός, διατηρείται τουλάχιστον η μοβ κατάσταση.

Emissive 変更

Άλφα 1
Διάχυτο (κόκκινο) 0.8
Διάχυτο (πράσινο) 0.8
Διάχυτο (μπλε) 0
Emissive (Κόκκινο) 1
Emissive (Πράσινο) 0
Emissive (Μπλε) 1
Κατοπτρισμός (Κόκκινο) 0
Κατοπτρισμός (Πράσινο) 0
Κατοπτρισμός (Μπλε) 0
Κατοπτρική δύναμη 5

Κατοπτρικές αλλαγές

Ρυθμίζοντας το Specular, το υλικό θα εμφανίζεται αντανακλαστικό.

Specular 変更

Άλφα 1
Διάχυτο (κόκκινο) 0.8
Διάχυτο (πράσινο) 0.8
Διάχυτο (μπλε) 0
Emissive (Κόκκινο) 0
Emissive (Πράσινο) 0
Emissive (Μπλε) 0
Κατοπτρισμός (Κόκκινο) 1
Κατοπτρισμός (Πράσινο) 1
Κατοπτρισμός (Μπλε) 1
Κατοπτρική δύναμη 5

Τροποποίηση SpecularPower

Η αλλαγή του SpecularPower αλλάζει το εύρος της ανακλαστικής επιφάνειας.

SpecularPower 変更

Άλφα 1
Διάχυτο (κόκκινο) 0.8
Διάχυτο (πράσινο) 0.8
Διάχυτο (μπλε) 0
Emissive (Κόκκινο) 0
Emissive (Πράσινο) 0
Emissive (Μπλε) 0
Κατοπτρισμός (Κόκκινο) 1
Κατοπτρισμός (Πράσινο) 1
Κατοπτρισμός (Μπλε) 1
Κατοπτρική δύναμη 20

αγρός

Το πεδίο έχει σημαντικές πληροφορίες για να ορίσετε σε BasicEffect. Επιπλέον, έχει παραμέτρους για την επιλογή μενού, αλλά επειδή είναι μόνο μια παράμετρος για λειτουργία, θα παραλείψω τις λεπτομέρειες.

/// <summary>
/// 不透明度
/// </summary>
private float alpha = 1.0f;

/// <summary>
/// ディフーズ
/// </summary>
private Vector3 diffuse = Vector3.One;

/// <summary>
/// エミッシブ
/// </summary>
private Vector3 emissive = Vector3.Zero;

/// <summary>
/// スペキュラー
/// </summary>
private Vector3 specular = Vector3.Zero;

/// <summary>
/// スペキュラーの強さ
/// </summary>
private float specularPower = 5.0f;

Ανάκτηση του υλικού του μοντέλου

Ανακτάται η τιμή του υλικού που ορίζεται στο μοντέλο ως αρχική τιμή. Σε αυτό το δείγμα, ο κώδικας γράφεται με την υπόθεση ότι υπάρχει μόνο ένα σύνολο εφέ στο μοντέλο.

// ライトとビュー、プロジェクションはあらかじめ設定しておく
foreach (ModelMesh mesh in this.model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        // デフォルトのライト適用
        effect.EnableDefaultLighting();

        // ビューマトリックスをあらかじめ設定 ((0, 0, 6) から原点を見る)
        effect.View = Matrix.CreateLookAt(
            new Vector3(0.0f, 0.0f, 6.0f),
            Vector3.Zero,
            Vector3.Up
        );

        // プロジェクションマトリックスをあらかじめ設定
        effect.Projection = Matrix.CreatePerspectiveFieldOfView(
            MathHelper.ToRadians(45.0f),
            (float)this.GraphicsDevice.Viewport.Width /
                (float)this.GraphicsDevice.Viewport.Height,
            1.0f,
            100.0f
        );

        // モデルのマテリアルを取得 //

        // アルファ
        this.alpha = effect.Alpha;

        // ディフーズ
        this.diffuse = effect.DiffuseColor;

        // エミッシブ
        this.emissive = effect.EmissiveColor;

        // スペキュラー
        this.specular = effect.SpecularColor;

        // スペキュラーの強さ
        this.specularPower = effect.SpecularPower;
    }
}

Ρύθμιση του υλικού

Το δείγμα ορίζει μια τιμή στο BasicEffect του μοντέλου. Για "DiffuseColor", "EmissiveColor" και "SpecularColor", ορίστε σε ένα Vector3, όχι σε μια δομή χρώματος. Καθορίστε τα στοιχεία του κόκκινου για το X, του πράσινου για το Y και του μπλε για το Z με τιμές 0,0 ~ 1,0.

// マテリアルを設定
foreach (ModelMesh mesh in this.model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        // 不透明度
        effect.Alpha = this.alpha;

        // ディフーズ
        effect.DiffuseColor = this.diffuse;

        // エミッシブ
        effect.EmissiveColor = this.emissive;

        // スペキュラー
        effect.SpecularColor = this.specular;

        // スペキュラーの強さ
        effect.SpecularPower = this.specularPower;
    }
}

Στο δείγμα, υπάρχει κώδικας όπως ο κωδικός λειτουργίας υλικού και η εμφάνιση συμβολοσειρών τιμών, αλλά υπάρχουν μέρη που δεν σχετίζονται άμεσα με το BasicMaterial, οπότε θα παραλείψω την εξήγηση. Μπορείτε να κατεβάσετε το δείγμα ή να δείτε τον πλήρη κώδικα.

BasicEffect.Alpha ιδιοκτησία

Παίρνει και ορίζει την αδιαφάνεια. Καθορίστε μια τιμή στην περιοχή 0,0 ~ 1,0. επιπλέω λήψη, ορισμός

BasicEffect.DiffuseColor ιδιοκτησία

Παίρνει και ορίζει το διάχυτο χρώμα. Το X είναι κόκκινο, το Y είναι πράσινο, το Z είναι μπλε και κάθε τιμή είναι στην περιοχή 0,0 ~ 1,0. Διάνυσμα3 λήψη, ορισμός

BasicEffect.EmissiveColor ιδιοκτησία

Λαμβάνει και ορίζει το εκπεμπόμενο χρώμα. Το X είναι κόκκινο, το Y είναι πράσινο, το Z είναι μπλε και κάθε τιμή είναι στην περιοχή 0,0 ~ 1,0. Διάνυσμα3 λήψη, ορισμός

BasicEffect.SpecularColor ιδιοκτησία

Παίρνει και ορίζει το χρώμα που αντανακλάται. Το X είναι κόκκινο, το Y είναι πράσινο, το Z είναι μπλε και κάθε τιμή είναι στην περιοχή 0,0 ~ 1,0. Διάνυσμα3 λήψη, ορισμός

BasicEffect.SpecularPower ιδιοκτησία

Παίρνει και ρυθμίζει την ένταση της αντανάκλασης. Η τιμή καθορίζεται ως 0,0~. επιπλέω λήψη, ορισμός

Όλοι οι κωδικοί

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
#if WINDOWS_PHONE
using Microsoft.Xna.Framework.Input.Touch;
#endif

namespace BasicEffectMaterial
{
    /// <summary>
    /// ゲームメインクラス
    /// </summary>
    public class GameMain : Microsoft.Xna.Framework.Game
    {
        /// <summary>
        /// グラフィックデバイス管理クラス
        /// </summary>
        private GraphicsDeviceManager graphics = null;

        /// <summary>
        /// スプライトのバッチ化クラス
        /// </summary>
        private SpriteBatch spriteBatch = null;

        /// <summary>
        /// スプライトでテキストを描画するためのフォント
        /// </summary>
        private SpriteFont font = null;

        /// <summary>
        /// 直前のキーボード入力の状態
        /// </summary>
        private KeyboardState oldKeyboardState = new KeyboardState();

        /// <summary>
        /// 直前のマウスの状態
        /// </summary>
        private MouseState oldMouseState = new MouseState();

        /// <summary>
        /// 直前のゲームパッド入力の状態
        /// </summary>
        private GamePadState oldGamePadState = new GamePadState();

        /// <summary>
        /// モデル
        /// </summary>
        private Model model = null;

        /// <summary>
        /// 不透明度
        /// </summary>
        private float alpha = 1.0f;

        /// <summary>
        /// ディフーズ
        /// </summary>
        private Vector3 diffuse = Vector3.One;

        /// <summary>
        /// エミッシブ
        /// </summary>
        private Vector3 emissive = Vector3.Zero;

        /// <summary>
        /// スペキュラー
        /// </summary>
        private Vector3 specular = Vector3.Zero;

        /// <summary>
        /// スペキュラーの強さ
        /// </summary>
        private float specularPower = 5.0f;

        /// <summary>
        /// 選択しているメニューのインデックス
        /// </summary>
        private int selectedMenuIndex = 0;

        /// <summary>
        /// パラメータの最大数
        /// </summary>
        private static int MaxParameterCount = 11;

        /// <summary>
        /// メニューリスト
        /// </summary>
        private static string[] MenuNameList = new string[]
            {
                "Alpha",
                "Diffuse (Red)",
                "Diffuse (Green)",
                "Diffuse (Blue)",
                "Emissive (Red)",
                "Emissive (Green)",
                "Emissive (Blue)",
                "Specular (Red)",
                "Specular (Green)",
                "Specular (Blue)",
                "SpecularPower"
            };

        /// <summary>
        /// パラメータテキストリスト
        /// </summary>
        private string[] parameters = new string[MaxParameterCount];


        /// <summary>
        /// GameMain コンストラクタ
        /// </summary>
        public GameMain()
        {
            // グラフィックデバイス管理クラスの作成
            this.graphics = new GraphicsDeviceManager(this);

            // ゲームコンテンツのルートディレクトリを設定
            this.Content.RootDirectory = "Content";

#if WINDOWS_PHONE
            // Windows Phone のデフォルトのフレームレートは 30 FPS
            this.TargetElapsedTime = TimeSpan.FromTicks(333333);

            // バックバッファサイズの設定
            this.graphics.PreferredBackBufferWidth = 480;
            this.graphics.PreferredBackBufferHeight = 800;

            // フルスクリーン表示
            this.graphics.IsFullScreen = true;
#endif

            // ウインドウ上でマウスのポインタを表示するようにする
            this.IsMouseVisible = true;
        }

        /// <summary>
        /// ゲームが始まる前の初期化処理を行うメソッド
        /// グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
        /// </summary>
        protected override void Initialize()
        {
            // コンポーネントの初期化などを行います
            base.Initialize();
        }

        /// <summary>
        /// ゲームが始まるときに一回だけ呼ばれ
        /// すべてのゲームコンテンツを読み込みます
        /// </summary>
        protected override void LoadContent()
        {
            // テクスチャーを描画するためのスプライトバッチクラスを作成します
            this.spriteBatch = new SpriteBatch(this.GraphicsDevice);

            // フォントをコンテンツパイプラインから読み込む
            this.font = this.Content.Load<SpriteFont>("Font");

            // モデルを作成
            this.model = this.Content.Load<Model>("Model");

            // ライトとビュー、プロジェクションはあらかじめ設定しておく
            foreach (ModelMesh mesh in this.model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    // デフォルトのライト適用
                    effect.EnableDefaultLighting();

                    // ビューマトリックスをあらかじめ設定 ((0, 0, 6) から原点を見る)
                    effect.View = Matrix.CreateLookAt(
                        new Vector3(0.0f, 0.0f, 6.0f),
                        Vector3.Zero,
                        Vector3.Up
                    );

                    // プロジェクションマトリックスをあらかじめ設定
                    effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                        MathHelper.ToRadians(45.0f),
                        (float)this.GraphicsDevice.Viewport.Width /
                            (float)this.GraphicsDevice.Viewport.Height,
                        1.0f,
                        100.0f
                    );

                    // モデルのマテリアルを取得 //

                    // アルファ
                    this.alpha = effect.Alpha;

                    // ディフーズ
                    this.diffuse = effect.DiffuseColor;

                    // エミッシブ
                    this.emissive = effect.EmissiveColor;

                    // スペキュラー
                    this.specular = effect.SpecularColor;

                    // スペキュラーの強さ
                    this.specularPower = effect.SpecularPower;
                }
            }
        }

        /// <summary>
        /// ゲームが終了するときに一回だけ呼ばれ
        /// すべてのゲームコンテンツをアンロードします
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: ContentManager で管理されていないコンテンツを
            //       ここでアンロードしてください
        }

        /// <summary>
        /// 描画以外のデータ更新等の処理を行うメソッド
        /// 主に入力処理、衝突判定などの物理計算、オーディオの再生など
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Update(GameTime gameTime)
        {
            // 入力デバイスの状態取得
            KeyboardState keyboardState = Keyboard.GetState();
            MouseState mouseState = Mouse.GetState();
            GamePadState gamePadState = GamePad.GetState(PlayerIndex.One);

            // Xbox 360 コントローラ、Windows Phone の BACK ボタンを押したときに
            // ゲームを終了させます
            if (gamePadState.Buttons.Back == ButtonState.Pressed)
            {
                this.Exit();
            }

            
            // メニューの選択
            if ((keyboardState.IsKeyDown(Keys.Up) && this.oldKeyboardState.IsKeyUp(Keys.Up)) ||
                (gamePadState.ThumbSticks.Left.Y >= 0.5f &&
                    this.oldGamePadState.ThumbSticks.Left.Y < 0.5f))
            {
                // 選択メニューをひとつ上に移動
                this.selectedMenuIndex =
                    (this.selectedMenuIndex + this.parameters.Length - 1) % this.parameters.Length;
            }
            if ((keyboardState.IsKeyDown(Keys.Down) && this.oldKeyboardState.IsKeyUp(Keys.Down)) ||
                (gamePadState.ThumbSticks.Left.Y <= -0.5f &&
                    this.oldGamePadState.ThumbSticks.Left.Y > -0.5f) ||
                (this.oldMouseState.LeftButton == ButtonState.Pressed &&
                 mouseState.LeftButton == ButtonState.Released))
            {
                // 選択メニューをひとつ下に移動
                this.selectedMenuIndex =
                    (this.selectedMenuIndex + this.parameters.Length + 1) % this.parameters.Length;
            }

            // 各マテリアルの値を操作
            float moveValue = 0.0f;
            if (keyboardState.IsKeyDown(Keys.Left))
            {
                moveValue -= (float)gameTime.ElapsedGameTime.TotalSeconds;
            }
            if (keyboardState.IsKeyDown(Keys.Right))
            {
                moveValue += (float)gameTime.ElapsedGameTime.TotalSeconds;
            }
            if (mouseState.LeftButton == ButtonState.Pressed)
            {
                moveValue += (mouseState.X - this.oldMouseState.X) * 0.005f;
            }
            if (gamePadState.IsConnected)
            {
                moveValue += gamePadState.ThumbSticks.Left.X *
                             (float)gameTime.ElapsedGameTime.TotalSeconds;
            }

            switch (this.selectedMenuIndex)
            {
                case 0: // 不透明度
                    this.alpha = MathHelper.Clamp(this.alpha + moveValue,
                                                  0.0f,
                                                  1.0f);
                    break;
                case 1: // ディフューズ (赤)
                    this.diffuse.X = MathHelper.Clamp(this.diffuse.X + moveValue,
                                                      0.0f,
                                                      1.0f);
                    break;
                case 2: // ディフューズ (緑)
                    this.diffuse.Y = MathHelper.Clamp(this.diffuse.Y + moveValue,
                                                      0.0f,
                                                      1.0f);
                    break;
                case 3: // ディフューズ (青)
                    this.diffuse.Z = MathHelper.Clamp(this.diffuse.Z + moveValue,
                                                      0.0f,
                                                      1.0f);
                    break;
                case 4: // エミッシブ (赤)
                    this.emissive.X = MathHelper.Clamp(this.emissive.X + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 5: // エミッシブ (緑)
                    this.emissive.Y = MathHelper.Clamp(this.emissive.Y + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 6: // エミッシブ (青)
                    this.emissive.Z = MathHelper.Clamp(this.emissive.Z + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 7: // スペキュラー (赤)
                    this.specular.X = MathHelper.Clamp(this.specular.X + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 8: // スペキュラー (緑)
                    this.specular.Y = MathHelper.Clamp(this.specular.Y + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 9: // スペキュラー (青)
                    this.specular.Z = MathHelper.Clamp(this.specular.Z + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 10: // スペキュラーの強さ
                    moveValue *= 5.0f;
                    this.specularPower = MathHelper.Clamp(this.specularPower + moveValue,
                                                          0.0f,
                                                          100.0f);
                    break;
            }

            // マテリアルを設定
            foreach (ModelMesh mesh in this.model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    // 不透明度
                    effect.Alpha = this.alpha;

                    // ディフーズ
                    effect.DiffuseColor = this.diffuse;

                    // エミッシブ
                    effect.EmissiveColor = this.emissive;

                    // スペキュラー
                    effect.SpecularColor = this.specular;

                    // スペキュラーの強さ
                    effect.SpecularPower = this.specularPower;
                }
            }

            // 入力情報を記憶
            this.oldKeyboardState = keyboardState;
            this.oldMouseState = mouseState;
            this.oldGamePadState = gamePadState;

            // 登録された GameComponent を更新する
            base.Update(gameTime);
        }

        /// <summary>
        /// 描画処理を行うメソッド
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Draw(GameTime gameTime)
        {
            // 画面を指定した色でクリアします
            this.GraphicsDevice.Clear(Color.CornflowerBlue);

            // 深度バッファを有効にする
            this.GraphicsDevice.DepthStencilState = DepthStencilState.Default;

            // モデルを描画
            foreach (ModelMesh mesh in this.model.Meshes)
            {
                mesh.Draw();
            }

            // スプライトの描画準備
            this.spriteBatch.Begin();

            // 操作
            this.spriteBatch.DrawString(this.font,
                "Up, Down : Select Menu",
                new Vector2(20.0f, 20.0f), Color.White);
            this.spriteBatch.DrawString(this.font,
                "Left, right : Change Value",
                new Vector2(20.0f, 45.0f), Color.White);
            this.spriteBatch.DrawString(this.font,
                "MouseClick & Drag :",
                new Vector2(20.0f, 70.0f), Color.White);
            this.spriteBatch.DrawString(this.font,
                "    Select Menu & Change Value",
                new Vector2(20.0f, 95.0f), Color.White);

            // 各メニュー //
            for (int i = 0; i < MenuNameList.Length; i++)
            {
                this.spriteBatch.DrawString(this.font,
                    MenuNameList[i],
                    new Vector2(40.0f, 120.0f + i * 24.0f), Color.White);
            }

            // 各パラメータ //

            // 不透明度
            this.parameters[0] = this.alpha.ToString();

            // ディフューズ (赤)
            this.parameters[1] = this.diffuse.X.ToString();

            // ディフューズ (緑)
            this.parameters[2] = this.diffuse.Y.ToString();

            // ディフューズ (青)
            this.parameters[3] = this.diffuse.Z.ToString();

            // エミッシブ (赤)
            this.parameters[4] = this.emissive.X.ToString();

            // エミッシブ (緑)
            this.parameters[5] = this.emissive.Y.ToString();

            // エミッシブ (青)
            this.parameters[6] = this.emissive.Z.ToString();

            // スペキュラー (赤)
            this.parameters[7] = this.specular.X.ToString();

            // スペキュラー (緑)
            this.parameters[8] = this.specular.Y.ToString();

            // スペキュラー (青)
            this.parameters[9] = this.specular.Z.ToString();

            // スペキュラーの強さ
            this.parameters[10] = this.specularPower.ToString();

            for (int i = 0; i < this.parameters.Length; i++)
            {
                this.spriteBatch.DrawString(this.font,
                    this.parameters[i],
                    new Vector2(250.0f, 120.0f + i * 24.0f), Color.White);
            }

            // 選択インデックス
            this.spriteBatch.DrawString(this.font, "*",
                new Vector2(20.0f, 124.0f + this.selectedMenuIndex * 24.0f), Color.White);

            // スプライトの一括描画
            this.spriteBatch.End();

            // 登録された DrawableGameComponent を描画する
            base.Draw(gameTime);
        }
    }
}