BasicEffect-Materialien
Zusammenfassung
Bearbeiten Sie die Parameter, die sich auf den Materialteil von BasicEffect beziehen, um zu sehen, wie das Modell aussieht.
Betriebsumgebung
Voraussetzungen
Unterstützte XNA-Versionen |
|
Unterstützte Plattformen |
|
Erforderliche Vertex-Shader-Version für Windows | 2.0 |
Erforderliche Pixel-Shader-Version für Windows | 2.0 |
Betriebsumgebung
Bahnsteig |
|
So arbeiten Sie mit dem Beispiel
Funktioniert TastaturXbox | 360 ControllerMaus | Touch | ||
---|---|---|---|---|
Wählen Sie die Parameter aus, die Sie ändern möchten | ↑、↓ | Linker Stick ↑, ↓ | Linke Taste | - |
Ändern von Parametern | ←、→ | Linker Stick ←, → | ←→ Ziehen | - |
Substanz
Was ist BasicEffect?
Wenn Sie in XNA 3D-Polygone anzeigen möchten, müssen Sie ein Shaderprogramm schreiben, um sie zu zeichnen und zu entscheiden, wie sie gezeichnet werden sollen. Erstellen Sie dazu eine separate Effektdatei, schreiben Sie ein Programm, lesen Sie es als Effektklasse (Effect) und führen Sie das Shaderprogramm aus.
Es gibt jedoch viele Fälle, in denen Sie keinen speziellen Zeicheneffekt benötigen, und selbst in solchen Fällen ist ein Effekt erforderlich, so dass es überraschend umständlich ist, sich die Mühe zu machen, ein Shader-Programm zu implementieren.
Daher werden grundlegende Parameter wie Materialien und Lichter im Vorfeld als Eigenschaften aufbereitet, so dass Effekte einfach "BasicEffect" gehandhabt werden können. Es ist sehr einfach, da Sie keine Effektdatei erstellen müssen, sondern einfach eine Instanz der Klasse erstellen können.
Selbst wenn Sie Modelldaten aus dem Inhalt laden, ist BasicEffect standardmäßig festgelegt, sodass Sie nicht einmal eine Instanz erstellen müssen.
Material
Material bezieht sich hauptsächlich auf die Eigenschaften des Materials einer Substanz und wird verwendet, um die Farbe, den Reflexionsgrad und die Stärke der Substanz anzugeben. Da es möglich geworden ist, es unabhängig in Shader-Programmen auszudrücken, kann die Definition eines Materials eine grobe Bedeutung haben, ohne festgelegt zu sein, aber BasicEffect hat die folgenden Parameter:
Alpha | Undurchsichtigkeit. Ein Wert von 1,0 gibt die Deckkraft an, und ein Wert von 0,0 steht für vollständige Transparenz. |
Diffuse Farbe | Die Farbe der Substanz des anzuzeigenden Objekts. Stellt Farben in RGB dar. Die Schattierung des Materials wird je nach Lichtzustand reflektiert. |
EmissiveColor | Die ausgegebene Farbe des anzuzeigenden Objekts. Stellt Farben in RGB dar. Da es sich um eine Farbe handelt, die ihr eigenes Licht ausstrahlt, wird die Farbe hinzugefügt, ohne vom Licht beeinflusst zu werden. |
SpecularColor (Glanzfarbe) | Die Farbe der Reflexion des anzuzeigenden Objekts. Stellt Farben in RGB dar. Je nach Richtung und Blickwinkel des Lichts scheint das Material reflektiert zu werden. |
SpecularPower (Glanzleistung) | Die Intensität der Reflexion des anzuzeigenden Objekts. Je höher der Wert, desto kleiner die reflektierte Fläche. |
Bild des materiellen Wandels
Die folgende Abbildung zeigt die verschiedenen Werte des Materials.
Grundstellung
Dies ist der Zustand unmittelbar nach dem Laden der Beispielmodelldaten.
Alpha | 1 |
Diffus (Rot) | 0.8 |
Diffus (Grün) | 0.8 |
Diffus (Blau) | 0 |
Emittierend (Rot) | 0 |
Emittierend (grün) | 0 |
Emittierend (Blau) | 0 |
Spiegel (Rot) | 0 |
Spiegel (Grün) | 0 |
Spiegel (Blau) | 0 |
SpecularPower (Glanzleistung) | 5 |
Änderung der Deckkraft (Alpha)
Dies ist der Zeitpunkt, an dem Sie die Deckkraft ändern. Die blaue Farbe des Hintergrunds ist schwach sichtbar.
Alpha | 0.31 |
Diffus (Rot) | 0.8 |
Diffus (Grün) | 0.8 |
Diffus (Blau) | 0 |
Emittierend (Rot) | 0 |
Emittierend (grün) | 0 |
Emittierend (Blau) | 0 |
Spiegel (Rot) | 0 |
Spiegel (Grün) | 0 |
Spiegel (Blau) | 0 |
SpecularPower (Glanzleistung) | 5 |
Diffuse Modifikationen
Die Farbe der Substanz wird verändert, um sie bläulich zu machen.
Alpha | 1 |
Diffus (Rot) | 0.05 |
Diffus (Grün) | 0.71 |
Diffus (Blau) | 1 |
Emittierend (Rot) | 0 |
Emittierend (grün) | 0 |
Emittierend (Blau) | 0 |
Spiegel (Rot) | 0 |
Spiegel (Grün) | 0 |
Spiegel (Blau) | 0 |
SpecularPower (Glanzleistung) | 5 |
Emittierende Modifikationen
Die roten und blauen Elemente von Emissive werden maximiert. Unabhängig vom Zustand des Lichts bleibt zumindest der violette Zustand erhalten.
Alpha | 1 |
Diffus (Rot) | 0.8 |
Diffus (Grün) | 0.8 |
Diffus (Blau) | 0 |
Emittierend (Rot) | 1 |
Emittierend (grün) | 0 |
Emittierend (Blau) | 1 |
Spiegel (Rot) | 0 |
Spiegel (Grün) | 0 |
Spiegel (Blau) | 0 |
SpecularPower (Glanzleistung) | 5 |
Änderungen der Spiegelung
Wenn Sie Spiegelung einstellen, erscheint das Material reflektierend.
Alpha | 1 |
Diffus (Rot) | 0.8 |
Diffus (Grün) | 0.8 |
Diffus (Blau) | 0 |
Emittierend (Rot) | 0 |
Emittierend (grün) | 0 |
Emittierend (Blau) | 0 |
Spiegel (Rot) | 1 |
Spiegel (Grün) | 1 |
Spiegel (Blau) | 1 |
SpecularPower (Glanzleistung) | 5 |
SpecularPower-Modifikation
Wenn Sie die SpecularPower ändern, ändert sich der Bereich der reflektierenden Oberfläche.
Alpha | 1 |
Diffus (Rot) | 0.8 |
Diffus (Grün) | 0.8 |
Diffus (Blau) | 0 |
Emittierend (Rot) | 0 |
Emittierend (grün) | 0 |
Emittierend (Blau) | 0 |
Spiegel (Rot) | 1 |
Spiegel (Grün) | 1 |
Spiegel (Blau) | 1 |
SpecularPower (Glanzleistung) | 20 |
Feld
Das Feld enthält Materialinformationen, die auf BasicEffect festgelegt werden sollen. Darüber hinaus verfügt es über Parameter für die Auswahl von Menüs, aber da es sich nur um einen Parameter für die Bedienung handelt, lasse ich die Details weg.
<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;
Abrufen des Materials des Modells
Der Wert des Materials, das im Modell als Anfangswert festgelegt ist, wird abgerufen. In diesem Beispiel wird der Code unter der Annahme geschrieben, dass nur ein Effektsatz im Modell festgelegt ist.
// ライトとビュー、プロジェクションはあらかじめ設定しておく
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;
}
}
Einrichten des Materials
Im Beispiel wird ein Wert auf den BasicEffect des Modells festgelegt. Für "DiffuseColor", "EmissiveColor" und "SpecularColor" werden sie in einem Vector3 und nicht in einer Color-Struktur festgelegt. Geben Sie die Elemente Rot für X, Grün für Y und Blau für Z mit Werten von 0,0~1,0 an.
// マテリアルを設定
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;
}
}
Im Beispiel gibt es Code, z. B. Materialvorgangscode und Zeichenfolgenanzeige von Werten, aber es gibt Teile, die sich nicht direkt auf BasicMaterial beziehen, daher lasse ich die Erläuterung weg. Sie können das Beispiel herunterladen oder sich den vollständigen Code ansehen.
BasicEffect.Alpha
Eigentum
Ruft die Deckkraft ab und legt sie fest. Geben Sie einen Wert im Bereich von 0,0~1,0 an. | schweben | Abrufen, Festlegen |
BasicEffect.DiffuseColor
Eigentum
Ruft die Streufarbe ab und legt sie fest. X ist rot, Y ist grün, Z ist blau und jeder Wert liegt im Bereich von 0,0~1,0. | Vektor3 | Abrufen, Festlegen |
BasicEffect.EmissiveColor
Eigentum
Ruft die ausgegebene Farbe ab und legt sie fest. X ist rot, Y ist grün, Z ist blau und jeder Wert liegt im Bereich von 0,0~1,0. | Vektor3 | Abrufen, Festlegen |
BasicEffect.SpecularColor
Eigentum
Ruft die reflektierte Farbe ab und legt sie fest. X ist rot, Y ist grün, Z ist blau und jeder Wert liegt im Bereich von 0,0~1,0. | Vektor3 | Abrufen, Festlegen |
BasicEffect.SpecularPower
Eigentum
Ruft die Intensität der Reflexion ab und legt diese fest. Der Wert wird als 0,0~ angegeben. | schweben | Abrufen, Festlegen |
Alle 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);
}
}
}