Basic مؤثر Lights

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

خلاصہ

بنیادی اثر کے ہلکے حصے سے متعلق پیرامیٹرز میں ہیرا پھیری کریں یہ دیکھنے کے لئے کہ ماڈل کس طرح دکھایا جاتا ہے۔

آپریٹنگ ماحول

ضروری شرائط

XNA ورژن کی حمایت کی
  • 4.0
حمایت یافتہ پلیٹ فارم
  • ونڈوز (ایکس پی ایس پی 2 یا اس کے بعد، وسٹا، 7)
  • ایکس بکس 360
  • ونڈوز فون 7
Windows Required Vertex Shader Version 2.0
Windows Required پکسل شادer Version 2.0

آپریٹنگ ماحول

پلیٹ فارم
  • ونڈوز 7
  • ایکس بکس 360
  • ونڈوز فون 7

نمونے کے ساتھ کیسے کام کریں

پر کام کرتا ہے
کی بورڈ ایکس باکس 360 کنٹرولر ماؤس ٹچ
وہ پیرامیٹرز منتخب کریں جنہیں آپ تبدیل کرنا چاہتے ہیں ↑、↓ بائیں چھڑی ^, ↓ بائیں بٹن -
پیرامیٹرز کو تبدیل کرنا ←、→ بائیں چھڑی ←، → ←→ ڈریگ -

مادہ

روشنی

روشنیاں کسی مادے کے سائے کی نمائندگی کرنے کے لئے استعمال کی جاتی ہیں. ایکس این اے میں ، لائٹس کو ماحول کی ترتیبات میں سے ایک کے طور پر سیٹ نہیں کیا جاتا ہے ، لیکن انفرادی اثرات کے لئے سیٹ کیا جاتا ہے۔

بنیادی اثر میں تین متوازی روشنی کے ذرائع دستیاب ہیں ، اور ہر روشنی میں مندرجہ ذیل پیرامیٹرز ہیں:

اہل طے کرتا ہے کہ روشنی دستیاب ہے یا نہیں۔
پھیلتا رنگ روشنی کا رنگ حتمی رنگ مادہ کے رنگ کے ساتھ ملا کر آؤٹ پٹ ہے.
SpecularColor منعکس شدہ روشنی کا رنگ. یہ مادہ کے عکاسی رنگ کو متاثر کرتا ہے.
سمت روشنی کی سمت

ایسی خصوصیات بھی ہیں جو انفرادی روشنیوں کے لئے عام ہیں۔

AmbientLightColor روشنی کے منبع سے آزادانہ طور پر مادہ کی چمک کو سیٹ کرتا ہے۔
PreferPerPixelLighting آپ وضاحت کرسکتے ہیں کہ آیا روشنی پکسلز میں شمار کی جاتی ہے یا نہیں۔

روشنی کی تبدیلی کی تصویر

نیچے دی گئی تصویر روشنیوں کی مختلف اقدار کو ظاہر کرتی ہے۔ نمونے میں ، تینوں لائٹس فعال ہیں ، لیکن نیچے دی گئی تصویر میں ، اسے ظاہر کرنے کے لئے صرف ایک روشنی استعمال کی گئی ہے۔

ابتدائی حالت

نمونہ ماڈل ڈیٹا لوڈ کرنے کے فورا بعد یہ حالت ہے۔

初期状態

ڈسفیوز (سرخ) 1
ڈسفیوز (سبز) 0.96
ڈسفیوز (نیلا) 0.80
Specular (Red) 1
اسپیکلر (سبز) 0.96
Specular (Blue) 0.80
سمت X -0.52
ہدایت Y -0.57
ہدایت Z -0.62
AmbientLightColor (Red) 0.05
AmbientLight کلر (Green) 0.09
AmbientLightColor (Blue) 0.18
PreferPerPixelLighting جھوٹ

ڈسفیوز کلر ترمیم

روشنی کے پھیلنے والے رنگ کو تبدیل کرنا۔ چونکہ سرخ اور نیلے کو 0 پر سیٹ کیا گیا ہے اور سبز کو 1 پر سیٹ کیا گیا ہے ، لہذا ماڈل کے صرف سبز حصے کو نمایاں کیا گیا ہے۔ (سرخ اور نیلے رنگ بھی نظر آتے ہیں ، لیکن اس کی وجہ ارد گرد کی روشنی ہے۔

DiffuseColor 変更

ڈسفیوز (سرخ) 0
ڈسفیوز (سبز) 1
ڈسفیوز (نیلا) 0
Specular (Red) 1
اسپیکلر (سبز) 0.96
Specular (Blue) 0.80
سمت X -0.52
ہدایت Y -0.57
ہدایت Z -0.62
AmbientLightColor (Red) 0.05
AmbientLight کلر (Green) 0.09
AmbientLightColor (Blue) 0.18
PreferPerPixelLighting جھوٹ

SpecularColor Change

منعکس شدہ روشنی کا رنگ تبدیل کرنا۔ چونکہ صرف سبز سیٹ کیا گیا ہے ، لہذا عکاسی والے حصے کا رنگ صرف سبز عنصر ہے۔

SpecularColor 変更

ڈسفیوز (سرخ) 1
ڈسفیوز (سبز) 0.96
ڈسفیوز (نیلا) 0.80
Specular (Red) 0
اسپیکلر (سبز) 1
Specular (Blue) 0
سمت X -0.52
ہدایت Y -0.57
ہدایت Z -0.62
AmbientLightColor (Red) 0.05
AmbientLight کلر (Green) 0.09
AmbientLightColor (Blue) 0.18
PreferPerPixelLighting جھوٹ

سمت کی تبدیلی

آپ سمت تبدیل کرکے روشنی کی سمت تبدیل کرسکتے ہیں۔ عام طور پر ، صرف سمت کا استعمال کیا جاتا ہے ، لہذا ویکٹر کو معمول پر لایا جاتا ہے۔

Direction 変更

ڈسفیوز (سرخ) 1
ڈسفیوز (سبز) 0.96
ڈسفیوز (نیلا) 0.80
Specular (Red) 1
اسپیکلر (سبز) 0.96
Specular (Blue) 0.80
سمت X 0.67
ہدایت Y 0.54
ہدایت Z -0.34
AmbientLightColor (Red) 0.05
AmbientLight کلر (Green) 0.09
AmbientLightColor (Blue) 0.18
PreferPerPixelLighting جھوٹ

AmbientLightColor Change

سرخ اور نیلے ماحول کی روشنیوں کو زیادہ سے زیادہ کیا جاتا ہے ، اور سبز کو 0 پر سیٹ کیا جاتا ہے۔ اگر آپ ان علاقوں کو دیکھیں جہاں روشنی نہیں چمکتی ہے تو ، آپ سبز ، سرخ اور نیلے رنگوں کے درمیان فرق واضح طور پر دیکھ سکتے ہیں۔

AmbientLightColor 変更

ڈسفیوز (سرخ) 1
ڈسفیوز (سبز) 0.96
ڈسفیوز (نیلا) 0.80
Specular (Red) 1
اسپیکلر (سبز) 0.96
Specular (Blue) 0.80
سمت X -0.52
ہدایت Y -0.57
ہدایت Z -0.62
AmbientLightColor (Red) 1
AmbientLight کلر (Green) 0
AmbientLightColor (Blue) 1
PreferPerPixelLighting جھوٹ

PreferPerPixelLighting Modification

پکسل بلحاظ پکسل لائٹنگ کے حساب ات کی اجازت دینے کے لئے ٹرو پر ترجیح دیں۔ ڈایاگرام میں یہ دیکھنا مشکل ہے ، لیکن ورٹیکس لیول لائٹنگ کی صورت میں ، کثیر الجہتی کی حدود کسی نہ کسی طرح نظر آتی ہیں ، لیکن پکسل بائی پکسل لائٹنگ کی صورت میں ، بہت ہموار سائے کا اظہار کیا جاسکتا ہے۔

ویسے ، اگر آپ پکسل شیڈر 2.0 کی حمایت نہیں کرتے ہیں تو آپ پر پکسل لائٹنگ پراپرٹی استعمال نہیں کرسکتے ہیں۔ اس کے علاوہ ، اگر آپ ایک سے زیادہ لائٹس استعمال کرتے ہیں تو ، یہ عجیب لگ سکتا ہے۔

PreferPerPixelLighting 変更

ڈسفیوز (سرخ) 1
ڈسفیوز (سبز) 0.96
ڈسفیوز (نیلا) 0.80
Specular (Red) 1
اسپیکلر (سبز) 0.96
Specular (Blue) 0.80
سمت X -0.52
ہدایت Y -0.57
ہدایت Z -0.62
AmbientLightColor (Red) 0.05
AmbientLight کلر (Green) 0.09
AmbientLightColor (Blue) 0.18
PreferPerPixelLighting سچ
Per-vertex lightingPer-پکسل لائٹنگ
頂点単位のライティング ピクセル単位のライティング

لائٹس کے لئے پیرامیٹر کلاس کی تعریفیں

چونکہ بنیادی اثر میں متعدد روشنیاں ہوسکتی ہیں ، لہذا ہم نے روشنی کے پیرامیٹرز مقرر کرنے کے لئے ایک کلاس بنائی ہے۔ پیرامیٹرز وہی ہیں جو بیسک ایفیکٹ لائٹ (بیسک ڈائریکشنل لائٹ) کے لئے سیٹ کیے جاسکتے ہیں۔

/// <summary>
/// ライトパラメータ
/// </summary>
public class LightParameter
{
    /// <summary>
    /// ライト有効フラグ
    /// </summary>
    public bool Enabled;

    /// <summary>
    /// ディフューズカラー
    /// </summary>
    public Vector3 DiffuseColor;

    /// <summary>
    /// スペキュラーカラー
    /// </summary>
    public Vector3 SpecularColor;

    /// <summary>
    /// ライトの方向
    /// </summary>
    public Vector3 Direction;
}

کھیت

روشنی کو ترتیب دینے کے لئے ضروری پیرامیٹرز کی وضاحت کرتا ہے۔ چونکہ آپ روشنیوں کے لئے تین لائٹس سیٹ کرسکتے ہیں ، لہذا سرے میں عناصر کی تعداد بھی تین ہے۔ دیگر فیلڈز مینو آپریشنز ، کریکٹر ڈسپلے وغیرہ کے لئے استعمال ہوتے ہیں ، لہذا براہ کرم مکمل کوڈ کا حوالہ دیں۔

/// <summary>
/// 選択しているライトのインデックス
/// </summary>
private int selectedLightIndex = 0;

/// <summary>
/// ライトのパラメータ
/// </summary>
private LightParameter[] lightParameters = new LightParameter[]
    {
        new LightParameter(),
        new LightParameter(),
        new LightParameter()
    };

/// <summary>
/// アンビエントカラー
/// </summary>
private Vector3 ambientLightColor = Vector3.Zero;

/// <summary>
/// ピクセル単位のライティング
/// </summary>
private bool isPreferPerPixelLighting = false;

پہلے سے طے شدہ تحریر کا حصول

بنیادی اثر.فعال ڈیفالٹ لائٹنگ طریقہ ایکس این اے فریم ورک کے ذریعہ بیان کردہ روشنی کے پیرامیٹرز کو ایک اثر کے لئے مقرر کرتا ہے۔ ہم اسے ایک بار میدان میں رکھنے کے لئے یہ قیمت حاصل کر رہے ہیں۔ (نمونے میں ، یہ متعدد بار حاصل کرنے کی شکل میں ہے ، لیکن یہ آسان ہے کیونکہ اگر آپ اسے الگ سے حاصل کرنے کے لئے کوڈ لکھتے ہیں تو یہ طویل ہوگا۔

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

        // ビューマトリックスをあらかじめ設定 ((0, 0, 8) から原点を見る)
        effect.View = Matrix.CreateLookAt(
            new Vector3(0.0f, 0.0f, 8.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.lightParameters[0].Enabled = effect.DirectionalLight0.Enabled;
        this.lightParameters[0].DiffuseColor = effect.DirectionalLight0.DiffuseColor;
        this.lightParameters[0].SpecularColor = effect.DirectionalLight0.SpecularColor;
        this.lightParameters[0].Direction = effect.DirectionalLight0.Direction;

        this.lightParameters[1].Enabled = effect.DirectionalLight1.Enabled;
        this.lightParameters[1].DiffuseColor = effect.DirectionalLight1.DiffuseColor;
        this.lightParameters[1].SpecularColor = effect.DirectionalLight1.SpecularColor;
        this.lightParameters[1].Direction = effect.DirectionalLight1.Direction;

        this.lightParameters[2].Enabled = effect.DirectionalLight2.Enabled;
        this.lightParameters[2].DiffuseColor = effect.DirectionalLight2.DiffuseColor;
        this.lightParameters[2].SpecularColor = effect.DirectionalLight2.SpecularColor;
        this.lightParameters[2].Direction = effect.DirectionalLight2.Direction;

        // アンビエントカラー
        this.ambientLightColor = effect.AmbientLightColor;

        // ピクセル単位のライティング
        this.isPreferPerPixelLighting = effect.PreferPerPixelLighting;
    }
}

روشنیاں نصب کرنا

میں ماڈل کے بنیادی اثر پر روشنی ڈال رہا ہوں۔ قیمت صرف بنیادی اثر کے ہلکے پیرامیٹر پر سیٹ کی گئی ہے. لائٹ پیرامیٹر تبدیلی آپریشن کے کوڈ کے لئے، براہ کرم مکمل کوڈ کو الگ سے دیکھیں.

foreach (ModelMesh mesh in this.model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        for (int i = 0; i < this.lightParameters.Length; i++)
        {
            // ライトを取得
            BasicDirectionalLight light = null;

            switch (i)
            {
                case 0:
                    light = effect.DirectionalLight0;
                    break;
                case 1:
                    light = effect.DirectionalLight1;
                    break;
                case 2:
                    light = effect.DirectionalLight2;
                    break;
            }

            // ライト有効フラグ
            light.Enabled = this.lightParameters[i].Enabled;

            // ライトのディフーズカラー
            light.DiffuseColor = this.lightParameters[i].DiffuseColor;

            // ライトのスペキュラーカラー
            light.SpecularColor = this.lightParameters[i].SpecularColor;

            // ライトの方向
            light.Direction = this.lightParameters[i].Direction;
        }

        // アンビエントカラー
        effect.AmbientLightColor = this.ambientLightColor;

        // ピクセル単位のライティング
        effect.PreferPerPixelLighting = this.isPreferPerPixelLighting;

    }
}

BasicEffect.DirectionalLight0 مال

پہلا متوازی روشنی کا ذریعہ پیرامیٹر ملتا ہے۔ BasicDirectionalLight پانا

BasicEffect.DirectionalLight1 مال

دوسرا متوازی روشنی کا ذریعہ پیرامیٹر حاصل کریں۔ BasicDirectionalLight پانا

BasicEffect.DirectionalLight2 مال

تیسرا متوازی روشنی کا ذریعہ پیرامیٹر حاصل کریں۔ BasicDirectionalLight پانا

BasicEffect.AmbientLightColor مال

ارد گرد کی روشنی کا رنگ حاصل کرتا ہے اور سیٹ کرتا ہے۔ X سرخ ہے، Y سبز ہے، Z نیلا ہے، اور ہر قیمت 0.0 ~ 1.0 کی حد میں ہے. Vector3 حاصل کریں، سیٹ کریں

BasicEffect.PreferPerPixelLighting مال

اگر درست ثابت ہو تو ، روشنی کے حساب ات فی پکسل کی بنیاد پر انجام دیئے جاسکتے ہیں۔ تاہم ، اس خصوصیت کو سچ ثابت کرنے کے لئے ، اسے پکسل شیڈر 2.0 یا اس سے زیادہ کی حمایت کرنا ضروری ہے۔ اگر غلط ثابت ہوتا ہے تو ، روشنی کا حساب فی ورٹیکس کی بنیاد پر انجام دیا جائے گا۔ bool حاصل کریں، سیٹ کریں

BasicDirectionalLight.Enabled مال

روشنی کو سیٹ اور غیر فعال کرتا ہے۔ bool حاصل کریں، سیٹ کریں

BasicDirectionalLight.DiffuseColor مال

روشنی کا پھیلتا ہوا رنگ حاصل کرتا ہے اور سیٹ کرتا ہے۔ X سرخ ہے، Y سبز ہے، Z نیلا ہے، اور ہر قیمت 0.0 ~ 1.0 کی حد میں ہے. Vector3 حاصل کریں، سیٹ کریں

BasicDirectionalLight.SpecularColor مال

روشنی کا منعکس شدہ رنگ حاصل کرتا ہے اور سیٹ کرتا ہے۔ X سرخ ہے، Y سبز ہے، Z نیلا ہے، اور ہر قیمت 0.0 ~ 1.0 کی حد میں ہے. Vector3 حاصل کریں، سیٹ کریں

BasicDirectionalLight.Direction مال

روشنی کی سمت حاصل کرتا ہے اور مقرر کرتا ہے۔ Vector3 حاصل کریں، سیٹ کریں

تمام کوڈز

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 BasicEffectLight
{
    /// <summary>
    /// ゲームメインクラス
    /// </summary>
    public class GameMain : Microsoft.Xna.Framework.Game
    {
        /// <summary>
        /// ライトパラメータ
        /// </summary>
        public class LightParameter
        {
            /// <summary>
            /// ライト有効フラグ
            /// </summary>
            public bool Enabled;

            /// <summary>
            /// ディフューズカラー
            /// </summary>
            public Vector3 DiffuseColor;

            /// <summary>
            /// スペキュラーカラー
            /// </summary>
            public Vector3 SpecularColor;

            /// <summary>
            /// ライトの方向
            /// </summary>
            public Vector3 Direction;
        }

        /// <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 int selectedMenuIndex = 0;

        /// <summary>
        /// 選択しているライトのインデックス
        /// </summary>
        private int selectedLightIndex = 0;

        /// <summary>
        /// ライトのパラメータ
        /// </summary>
        private LightParameter[] lightParameters = new LightParameter[]
            {
                new LightParameter(),
                new LightParameter(),
                new LightParameter()
            };

        /// <summary>
        /// アンビエントカラー
        /// </summary>
        private Vector3 ambientLightColor = Vector3.Zero;

        /// <summary>
        /// ピクセル単位のライティング
        /// </summary>
        private bool isPreferPerPixelLighting = false;

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

        /// <summary>
        /// メニューリスト
        /// </summary>
        private static string[] MenuNameList = new string[]
            {
                "LightIndex",
                "Light Enable",
                "DiffuseColor (Red)",
                "DiffuseColor (Green)",
                "DiffuseColor (Blue)",
                "SpecularColor (Red)",
                "SpecularColor (Green)",
                "SpecularColor (Blue)",
                "Direction X",
                "Direction Y",
                "Direction Z",
                "AmbientLightColor (Red)",
                "AmbientLightColor (Green)",
                "AmbientLightColor (Blue)",
                "PreferPerPixelLighting",
            };

        /// <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()
        {
            // TODO: ここに初期化ロジックを書いてください

            // コンポーネントの初期化などを行います
            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, 8) から原点を見る)
                    effect.View = Matrix.CreateLookAt(
                        new Vector3(0.0f, 0.0f, 8.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.lightParameters[0].Enabled = effect.DirectionalLight0.Enabled;
                    this.lightParameters[0].DiffuseColor = effect.DirectionalLight0.DiffuseColor;
                    this.lightParameters[0].SpecularColor = effect.DirectionalLight0.SpecularColor;
                    this.lightParameters[0].Direction = effect.DirectionalLight0.Direction;

                    this.lightParameters[1].Enabled = effect.DirectionalLight1.Enabled;
                    this.lightParameters[1].DiffuseColor = effect.DirectionalLight1.DiffuseColor;
                    this.lightParameters[1].SpecularColor = effect.DirectionalLight1.SpecularColor;
                    this.lightParameters[1].Direction = effect.DirectionalLight1.Direction;

                    this.lightParameters[2].Enabled = effect.DirectionalLight2.Enabled;
                    this.lightParameters[2].DiffuseColor = effect.DirectionalLight2.DiffuseColor;
                    this.lightParameters[2].SpecularColor = effect.DirectionalLight2.SpecularColor;
                    this.lightParameters[2].Direction = effect.DirectionalLight2.Direction;

                    // アンビエントカラー
                    this.ambientLightColor = effect.AmbientLightColor;

                    // ピクセル単位のライティング
                    this.isPreferPerPixelLighting = effect.PreferPerPixelLighting;
                }
            }
        }

        /// <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;
            }

            if (moveValue != 0.0f)
            {
                LightParameter selectedLight = this.lightParameters[this.selectedLightIndex];

                switch (this.selectedMenuIndex)
                {
                    case 0:
                        // ライトのインデックス
                        if ((keyboardState.IsKeyDown(Keys.Left) &&
                                this.oldKeyboardState.IsKeyUp(Keys.Left)) ||
                            (mouseState.LeftButton == ButtonState.Pressed &&
                                (mouseState.X - this.oldMouseState.X) >= 5) ||
                            (gamePadState.ThumbSticks.Left.X >= 0.5f &&
                                this.oldGamePadState.ThumbSticks.Left.X < 0.5f))
                        {
                            // ライトのインデックスをひとつ減らす
                            this.selectedLightIndex =
                                (this.selectedLightIndex + this.lightParameters.Length - 1) %
                                    this.lightParameters.Length;
                        }
                        if ((keyboardState.IsKeyDown(Keys.Right) &&
                                this.oldKeyboardState.IsKeyUp(Keys.Right)) ||
                            (mouseState.LeftButton == ButtonState.Pressed &&
                                (mouseState.X - this.oldMouseState.X) <= -5) ||
                            (gamePadState.ThumbSticks.Left.X <= -0.5f &&
                                this.oldGamePadState.ThumbSticks.Left.X > -0.5f))
                        {
                            // ライトのインデックスをひとつ増やす
                            this.selectedLightIndex =
                                (this.selectedLightIndex + this.lightParameters.Length + 1) %
                                    this.lightParameters.Length;
                        }
                        if (mouseState.LeftButton == ButtonState.Pressed)
                        {
                            this.selectedLightIndex = (int)(
                                MathHelper.Clamp((float)mouseState.X / this.GraphicsDevice.Viewport.Width * 3, 0, 2));
                        }
                        break;
                    case 1:
                        // ライト有効フラグ
                        selectedLight.Enabled = (moveValue > 0.0f);
                        break;
                    case 2:
                        // ライトのディフーズカラー(赤)
                        Vector3 diffuseX = selectedLight.DiffuseColor;
                        diffuseX.X = MathHelper.Clamp(diffuseX.X + moveValue, 0.0f, 1.0f);
                        selectedLight.DiffuseColor = diffuseX;
                        break;
                    case 3:
                        // ライトのディフーズカラー(緑)
                        Vector3 diffuseY = selectedLight.DiffuseColor;
                        diffuseY.Y = MathHelper.Clamp(diffuseY.Y + moveValue, 0.0f, 1.0f);
                        selectedLight.DiffuseColor = diffuseY;
                        break;
                    case 4:
                        // ライトのディフーズカラー(青)
                        Vector3 diffuseZ = selectedLight.DiffuseColor;
                        diffuseZ.Z = MathHelper.Clamp(diffuseZ.Z + moveValue, 0.0f, 1.0f);
                        selectedLight.DiffuseColor = diffuseZ;
                        break;
                    case 5:
                        // ライトのスペキュラーカラー(赤)
                        Vector3 specularX = selectedLight.SpecularColor;
                        specularX.X = MathHelper.Clamp(specularX.X + moveValue, 0.0f, 1.0f);
                        selectedLight.SpecularColor = specularX;
                        break;
                    case 6:
                        // ライトのスペキュラーカラー(緑)
                        Vector3 specularY = selectedLight.SpecularColor;
                        specularY.Y = MathHelper.Clamp(specularY.Y + moveValue, 0.0f, 1.0f);
                        selectedLight.SpecularColor = specularY;
                        break;
                    case 7:
                        // ライトのスペキュラーカラー(青)
                        Vector3 specularZ = selectedLight.SpecularColor;
                        specularZ.Z = MathHelper.Clamp(specularZ.Z + moveValue, 0.0f, 1.0f);
                        selectedLight.SpecularColor = specularZ;
                        break;
                    case 8:
                        // ライトの方向X
                        Vector3 directionX = selectedLight.Direction;
                        directionX.X += moveValue;
                        selectedLight.Direction = directionX;
                        break;
                    case 9:
                        // ライトの方向Y
                        Vector3 directionY = selectedLight.Direction;
                        directionY.Y += moveValue;
                        selectedLight.Direction = directionY;
                        break;
                    case 10:
                        // ライトの方向Z
                        Vector3 directionZ = selectedLight.Direction;
                        directionZ.Z += moveValue;
                        selectedLight.Direction = directionZ;
                        break;
                    case 11:
                        // アンビエントカラー(赤)
                        this.ambientLightColor.X =
                            MathHelper.Clamp(this.ambientLightColor.X + moveValue, 0.0f, 1.0f);
                        break;
                    case 12:
                        // アンビエントカラー(緑)
                        this.ambientLightColor.Y =
                            MathHelper.Clamp(this.ambientLightColor.Y + moveValue, 0.0f, 1.0f);
                        break;
                    case 13:
                        // アンビエントカラー(青)
                        this.ambientLightColor.Z =
                            MathHelper.Clamp(this.ambientLightColor.Z + moveValue, 0.0f, 1.0f);
                        break;
                    case 14:
                        // ピクセル単位のライティング
                        this.isPreferPerPixelLighting = (moveValue > 0.0f);
                        break;
                }
            }

            // ライトを設定
            foreach (ModelMesh mesh in this.model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    for (int i = 0; i < this.lightParameters.Length; i++)
                    {
                        // ライトを取得
                        DirectionalLight light = null;

                        switch (i)
                        {
                            case 0:
                                light = effect.DirectionalLight0;
                                break;
                            case 1:
                                light = effect.DirectionalLight1;
                                break;
                            case 2:
                                light = effect.DirectionalLight2;
                                break;
                        }

                        // ライト有効フラグ
                        light.Enabled = this.lightParameters[i].Enabled;

                        // ライトのディフーズカラー
                        light.DiffuseColor = this.lightParameters[i].DiffuseColor;

                        // ライトのスペキュラーカラー
                        light.SpecularColor = this.lightParameters[i].SpecularColor;

                        // ライトの方向
                        light.Direction = this.lightParameters[i].Direction;
                    }

                    // アンビエントカラー
                    effect.AmbientLightColor = this.ambientLightColor;

                    // ピクセル単位のライティング
                    effect.PreferPerPixelLighting = this.isPreferPerPixelLighting;

                }
            }

            // 入力情報を記憶
            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)
            {
#if WINDOWS_PHONE
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.World = Matrix.CreateRotationZ(-MathHelper.PiOver2);
                }
#endif

                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 * 20.0f), Color.White);
            }

            // 各パラメータ //

            LightParameter selectedLight = this.lightParameters[this.selectedLightIndex];

            // ライトのインデックス
            this.parameters[0] = this.selectedLightIndex.ToString();

            // ライトの有効フラグ
            this.parameters[1] = selectedLight.Enabled.ToString();

            // ライトのディフーズカラー(赤)
            this.parameters[2] = selectedLight.DiffuseColor.X.ToString();

            // ライトのディフーズカラー(緑)
            this.parameters[3] = selectedLight.DiffuseColor.Y.ToString();

            // ライトのディフーズカラー(青)
            this.parameters[4] = selectedLight.DiffuseColor.Z.ToString();

            // ライトのスペキュラーカラー(赤)
            this.parameters[5] = selectedLight.SpecularColor.X.ToString();

            // ライトのスペキュラーカラー(緑)
            this.parameters[6] = selectedLight.SpecularColor.Y.ToString();

            // ライトのスペキュラーカラー(青)
            this.parameters[7] = selectedLight.SpecularColor.Z.ToString();

            // ライトの方向X
            this.parameters[8] = selectedLight.Direction.X.ToString();

            // ライトの方向Y
            this.parameters[9] = selectedLight.Direction.Y.ToString();

            // ライトの方向Z
            this.parameters[10] = selectedLight.Direction.Z.ToString();

            // アンビエントカラー(赤)
            this.parameters[11] = this.ambientLightColor.X.ToString();

            // アンビエントカラー(緑)
            this.parameters[12] = this.ambientLightColor.Y.ToString();

            // アンビエントカラー(青)
            this.parameters[13] = this.ambientLightColor.Z.ToString();

            // ピクセル単位のライティング
            this.parameters[14] = this.isPreferPerPixelLighting.ToString();


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

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

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

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