BasicEffect Materials
summary
Manipulate the parameters related to the material part of the BasicEffect to see how the model looks.
Operating environment
Prerequisites
Supported XNA Versions |
|
Supported Platforms |
|
Windows Required Vertex Shader Version | 2.0 |
Windows Required Pixel Shader Version | 2.0 |
Operating environment
platform |
|
How to work with the sample
Works keyboardXbox | 360 controllermouse | touch | ||
---|---|---|---|---|
Select the parameters you want to change | ↑、↓ | Left stick ↑, ↓ | Left Button | - |
Changing Parameters | ←、→ | Left stick ←, → | ←→ Drag | - |
substance
What Is BasicEffect?
In XNA, if you want to display 3D polygons, you have to write a shader program to draw them and decide how to draw them. To do this, create a separate effect file, write a program, read it as an effect class (Effect), and execute the shader program.
However, there are many cases where you don't need a special drawing effect, and even in such cases, an Effect is necessary, so it is surprisingly cumbersome to bother implementing a shader program.
Therefore, basic parameters such as materials and lights are prepared as properties in advance so that effects can be easily handled "BasicEffect". It is very easy because you do not need to create an effect file, you can handle it by simply creating an instance of the class.
Even if you load Model data from the content, BasicEffect is set by default, so you don't even need to create an instance.
material
Material mainly refers to the characteristics of the material of a substance, and is used to specify the color, degree of reflection, and strength of the substance. Since it has become possible to express it independently in shader programs, the definition of a material can have a rough meaning without being fixed, but BasicEffect has the following parameters:
Alpha | Opacity. A value of 1.0 indicates opacity, and a value of 0.0 represents complete transparency. |
DiffuseColor | The color of the substance of the object to be displayed. Represent colors in RGB. The shading of the material is reflected depending on the state of the light. |
EmissiveColor | The emitted color of the object to be displayed. Represent colors in RGB. Since it is a color that emits its own light, the color is added without being affected by light. |
SpecularColor | The color of the reflection of the object to be displayed. Represent colors in RGB. Depending on the direction and viewpoint of the light, the material will appear to be reflected. |
SpecularPower | The intensity of the reflection of the object to be displayed. The higher the value, the smaller the area reflected. |
Image of material change
The image below shows the different values of the material.
Initial state
This is the state immediately after loading the sample model data.
Alpha | 1 |
Diffuse (Red) | 0.8 |
Diffuse (Green) | 0.8 |
Diffuse (Blue) | 0 |
Emissive (Red) | 0 |
Emissive (Green) | 0 |
Emissive (Blue) | 0 |
Specular (Red) | 0 |
Specular (Green) | 0 |
Specular (Blue) | 0 |
SpecularPower | 5 |
Opacity (Alpha) change
This is when you change the opacity. The blue color of the background is faintly visible.
Alpha | 0.31 |
Diffuse (Red) | 0.8 |
Diffuse (Green) | 0.8 |
Diffuse (Blue) | 0 |
Emissive (Red) | 0 |
Emissive (Green) | 0 |
Emissive (Blue) | 0 |
Specular (Red) | 0 |
Specular (Green) | 0 |
Specular (Blue) | 0 |
SpecularPower | 5 |
Diffuse Modifications
The color of the substance is changed to make it bluish.
Alpha | 1 |
Diffuse (Red) | 0.05 |
Diffuse (Green) | 0.71 |
Diffuse (Blue) | 1 |
Emissive (Red) | 0 |
Emissive (Green) | 0 |
Emissive (Blue) | 0 |
Specular (Red) | 0 |
Specular (Green) | 0 |
Specular (Blue) | 0 |
SpecularPower | 5 |
Emissive Modifications
The red and blue elements of Emissive are maximized. Regardless of the state of the light, at least the purple state is maintained.
Alpha | 1 |
Diffuse (Red) | 0.8 |
Diffuse (Green) | 0.8 |
Diffuse (Blue) | 0 |
Emissive (Red) | 1 |
Emissive (Green) | 0 |
Emissive (Blue) | 1 |
Specular (Red) | 0 |
Specular (Green) | 0 |
Specular (Blue) | 0 |
SpecularPower | 5 |
Specular Changes
By setting Specular, the material will appear reflective.
Alpha | 1 |
Diffuse (Red) | 0.8 |
Diffuse (Green) | 0.8 |
Diffuse (Blue) | 0 |
Emissive (Red) | 0 |
Emissive (Green) | 0 |
Emissive (Blue) | 0 |
Specular (Red) | 1 |
Specular (Green) | 1 |
Specular (Blue) | 1 |
SpecularPower | 5 |
SpecularPower Modification
Changing the SpecularPower changes the range of the reflective surface.
Alpha | 1 |
Diffuse (Red) | 0.8 |
Diffuse (Green) | 0.8 |
Diffuse (Blue) | 0 |
Emissive (Red) | 0 |
Emissive (Green) | 0 |
Emissive (Blue) | 0 |
Specular (Red) | 1 |
Specular (Green) | 1 |
Specular (Blue) | 1 |
SpecularPower | 20 |
field
The field has material information to set to BasicEffect. In addition, it has parameters for selecting menus, but since it is only a parameter for operation, I will omit the details.
<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;
Retrieving the material of the model
The value of the material set in the model as the initial value is retrieved. In this sample, the code is written on the assumption that there is only one effect set in the 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;
}
}
Setting up the material
The sample sets a value to the Model's BasicEffect. For "DiffuseColor", "EmissiveColor", and "SpecularColor", set in a Vector3, not in a Color structure. Specify the elements of red for X, green for Y, and blue for Z with values of 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;
}
}
In the sample, there is code such as material operation code and string display of values, but there are parts that are not directly related to BasicMaterial, so I will omit the explanation. You can download the sample or check out the full code.
BasicEffect.Alpha
property
Gets and sets the opacity. Specify a value in the range of 0.0~1.0. | float | get, set |
BasicEffect.DiffuseColor
property
Gets and sets the diffuse color. X is red, Y is green, Z is blue, and each value is in the range 0.0~1.0. | Vector3 | get, set |
BasicEffect.EmissiveColor
property
Gets and sets the emitted color. X is red, Y is green, Z is blue, and each value is in the range 0.0~1.0. | Vector3 | get, set |
BasicEffect.SpecularColor
property
Gets and sets the reflected color. X is red, Y is green, Z is blue, and each value is in the range 0.0~1.0. | Vector3 | get, set |
BasicEffect.SpecularPower
property
Gets and sets the intensity of the reflection. The value is specified as 0.0~. | float | get, set |
All Codes
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);
}
}
}