BasicEffect fények
összefoglalás
Módosítsa a BasicEffect világos részéhez kapcsolódó paramétereket, hogy lássa, hogyan jelenik meg a modell.
Működési környezet
Előfeltételek
Támogatott XNA verziók |
|
Támogatott platformok |
|
Windows Szükséges Vertex Shader verzió | 2.0 |
Windows Szükséges Pixel Shader verzió | 2.0 |
Működési környezet
peron |
|
Hogyan kell dolgozni a mintával
Működik billentyűzetXbox | 360 kontrolleregér | érintés | ||
---|---|---|---|---|
Válassza ki a módosítani kívánt paramétereket | ↑、↓ | Bal kar ↑, ↓ | Bal gomb | - |
Paraméterek módosítása | ←、→ | Bal kar ←, → | ←→ húzás | - |
lényeg
fény
A fényeket egy anyag árnyékainak ábrázolására használják. Az XNA-ban a fények nem a környezeti beállítások egyikeként vannak beállítva, hanem az egyes effektusokra vannak beállítva.
A BasicEffect három párhuzamos fényforrással rendelkezik, és mindegyik fény a következő paraméterekkel rendelkezik:
Engedélyezve | Beállítja, hogy a fény elérhető legyen-e. |
Diffúz szín | A fény színe. A végső színt az anyag színével kombinálva adják ki. |
SpecularColor | A visszavert fény színe. Ez befolyásolja az anyag fényvisszaverő színét. |
Irány | A fény iránya. |
Vannak olyan tulajdonságok is, amelyek közösek az egyes fényekben.
AmbientLightColor | Az anyag fényerejét a fényforrástól függetlenül állítja be. |
PreferPerPixelLighting | Megadhatja, hogy a megvilágítás kiszámítása képpontban történjen-e. |
A fényváltozás képe
Az alábbi kép a fények különböző értékeit mutatja. A mintában mindhárom fény engedélyezve van, de az alábbi képen csak egy fény jelenik meg.
Kezdeti állapot
Ez az állapot közvetlenül a mintamodell adatainak betöltése után.
Diffúz (piros) | 1 |
Diffúz (zöld) | 0.96 |
Diffúz (kék) | 0.80 |
Fényvisszaverődés (piros) | 1 |
Tükör (zöld) | 0.96 |
Tükör (kék) | 0.80 |
X irány | -0.52 |
Y irány | -0.57 |
Z irány | -0.62 |
AmbientLightColor (piros) | 0.05 |
AmbientLightColor (zöld) | 0.09 |
AmbientLightColor (kék) | 0.18 |
PreferPerPixelLighting | Téves |
DiffuseColor módosítás
A fény diffúz színének megváltoztatása. Mivel a piros és a kék értéke 0, a zöld értéke pedig 1, csak a modell zöld része lesz kiemelve. (A piros és a kék is halványan látható, de ez a környezeti fénynek köszönhető.)
Diffúz (piros) | 0 |
Diffúz (zöld) | 1 |
Diffúz (kék) | 0 |
Fényvisszaverődés (piros) | 1 |
Tükör (zöld) | 0.96 |
Tükör (kék) | 0.80 |
X irány | -0.52 |
Y irány | -0.57 |
Z irány | -0.62 |
AmbientLightColor (piros) | 0.05 |
AmbientLightColor (zöld) | 0.09 |
AmbientLightColor (kék) | 0.18 |
PreferPerPixelLighting | Téves |
SpecularColor változás
A visszavert fény színének megváltoztatása. Mivel csak zöld van beállítva, a fényvisszaverő rész színe csak a zöld elem.
Diffúz (piros) | 1 |
Diffúz (zöld) | 0.96 |
Diffúz (kék) | 0.80 |
Fényvisszaverődés (piros) | 0 |
Tükör (zöld) | 1 |
Tükör (kék) | 0 |
X irány | -0.52 |
Y irány | -0.57 |
Z irány | -0.62 |
AmbientLightColor (piros) | 0.05 |
AmbientLightColor (zöld) | 0.09 |
AmbientLightColor (kék) | 0.18 |
PreferPerPixelLighting | Téves |
Irányváltás
A fény irányát az Irány megváltoztatásával módosíthatja. Általában csak tájolást használunk, így a vektor normalizálódik.
Diffúz (piros) | 1 |
Diffúz (zöld) | 0.96 |
Diffúz (kék) | 0.80 |
Fényvisszaverődés (piros) | 1 |
Tükör (zöld) | 0.96 |
Tükör (kék) | 0.80 |
X irány | 0.67 |
Y irány | 0.54 |
Z irány | -0.34 |
AmbientLightColor (piros) | 0.05 |
AmbientLightColor (zöld) | 0.09 |
AmbientLightColor (kék) | 0.18 |
PreferPerPixelLighting | Téves |
AmbientLightColor változás
A piros és kék környezeti fények maximalizálva vannak, a zöld pedig 0-ra van állítva. Ha megnézzük azokat a területeket, ahol a fény nem ragyog, jól látható a különbség a zöld, piros és kék árnyalatok között.
Diffúz (piros) | 1 |
Diffúz (zöld) | 0.96 |
Diffúz (kék) | 0.80 |
Fényvisszaverődés (piros) | 1 |
Tükör (zöld) | 0.96 |
Tükör (kék) | 0.80 |
X irány | -0.52 |
Y irány | -0.57 |
Z irány | -0.62 |
AmbientLightColor (piros) | 1 |
AmbientLightColor (zöld) | 0 |
AmbientLightColor (kék) | 1 |
PreferPerPixelLighting | Téves |
PreferPerPixelLighting módosítás
Állítsa a PreferPerPixelLighting beállítást True értékre a képpontonkénti megvilágítási számítások engedélyezéséhez. Az ábrán nehéz látni, de csúcsszintű megvilágítás esetén a sokszögek határai valahogy láthatóak, de pixelenkénti megvilágítás esetén nagyon sima árnyékok fejezhetők ki.
Egyébként nem használhatja a PreferPerPixelLighting tulajdonságot, ha nem támogatja a pixel shader 2.0-t. Továbbá, ha több lámpát használ, furcsán nézhet ki.
Diffúz (piros) | 1 |
Diffúz (zöld) | 0.96 |
Diffúz (kék) | 0.80 |
Fényvisszaverődés (piros) | 1 |
Tükör (zöld) | 0.96 |
Tükör (kék) | 0.80 |
X irány | -0.52 |
Y irány | -0.57 |
Z irány | -0.62 |
AmbientLightColor (piros) | 0.05 |
AmbientLightColor (zöld) | 0.09 |
AmbientLightColor (kék) | 0.18 |
PreferPerPixelLighting | Igaz |
Csúcspontonkénti megvilágításKéppontonkénti | megvilágítás |
---|---|
Fények paraméterosztály-definíciói
Mivel a BasicEffect több lámpával is rendelkezhet, létrehoztunk egy osztályt a fényparaméterek beállításához. A paraméterek megegyeznek a BasicEffect jelzőfényhez (BasicDirectionalLight) beállítható paraméterekkel.
<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;
}
mező
Meghatározza a fény beállításához szükséges paramétereket. Mivel három fényt állíthat be a fényekhez, a tömb elemeinek száma is három. A többi mező a menüműveletekhez, a karaktermegjelenítéshez stb. használatos, ezért kérjük, olvassa el a teljes kódot.
<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;
Alapértelmezett írásszerzés
A BasicEffect.EnableDefaultLighting metódus az XNA-keretrendszer által meghatározott fény paramétereit effektusra állítja. Ezt az értéket azért kapjuk, hogy egyszer a terepen tartsuk. (A mintában ez többszörös beszerzés formájában történik, de egyszerűsített, mert hosszú lesz, ha kódot ír a külön beszerzéshez.)
// ライトとビュー、プロジェクションはあらかじめ設定しておく
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;
}
}
A lámpák beállítása
Fényt állítok a modell BasicEffect-jére. Az érték egyszerűen a BasicEffect light paraméterére van beállítva. A fényparaméter-módosítási művelet kódját lásd a teljes kódban külön.
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
ingatlan
Lekéri az első párhuzamos fényforrás paramétert. | Alapirányított fény | kap |
BasicEffect.DirectionalLight1
ingatlan
Szerezzük be a második párhuzamos fényforrás paramétert. | Alapirányított fény | kap |
BasicEffect.DirectionalLight2
ingatlan
Szerezzük be a harmadik párhuzamos fényforrás paramétert. | Alapirányított fény | kap |
BasicEffect.AmbientLightColor
ingatlan
Beállítja és beállítja a környezeti fény színét. X piros, Y zöld, Z kék, és minden érték a 0,0~1,0 tartományban van. | Vektor3 | Get, set |
BasicEffect.PreferPerPixelLighting
ingatlan
Ha true (igaz) értékre van állítva, a megvilágítási számítások képpontonként végezhetők el. Ahhoz azonban, hogy ez a tulajdonság igaz legyen, támogatnia kell a pixel shader 2.0-s vagy újabb verzióját. Ha false (hamis) értékre van állítva, a megvilágítás kiszámítása csúcspontonként történik. | Bool | Get, set |
BasicDirectionalLight.Enabled
ingatlan
Beállítja és letiltja a fényt. | Bool | Get, set |
BasicDirectionalLight.DiffuseColor
ingatlan
Megkapja és beállítja a fény diffúz színét. X piros, Y zöld, Z kék, és minden érték a 0,0~1,0 tartományban van. | Vektor3 | Get, set |
BasicDirectionalLight.SpecularColor
ingatlan
Beállítja és beállítja a fény visszavert színét. X piros, Y zöld, Z kék, és minden érték a 0,0~1,0 tartományban van. | Vektor3 | Get, set |
BasicDirectionalLight.Direction
ingatlan
Beállítja és beállítja a fény irányát. | Vektor3 | Get, set |
Minden kód
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);
}
}
}