BasicEffect-materialen
samenvatting
Manipuleer de parameters met betrekking tot het materiaalgedeelte van het BasicEffect om te zien hoe het model eruitziet.
Werkomgeving
Voorwaarden
Ondersteunde XNA-versies |
|
Ondersteunde platforms |
|
Windows vereist Vertex Shader Version | 2.0 |
Windows vereist Pixel Shader-versie | 2.0 |
Werkomgeving
perron |
|
Werken met het voorbeeld
Werkt toetsenbordXbox | 360-controllermuis | touch | ||
---|---|---|---|---|
Selecteer de parameters die u wilt wijzigen | ↑、↓ | Linker joystick ↑, ↓ | Linker knop | - |
Parameters wijzigen | ←、→ | Linker joystick ←, → | ←→ slepen | - |
stof
Wat is BasicEffect?
Als je in XNA 3D-polygonen wilt weergeven, moet je een shader-programma schrijven om ze te tekenen en te beslissen hoe je ze wilt tekenen. Om dit te doen, maakt u een apart effectbestand, schrijft u een programma, leest u het als een effectklasse (Effect) en voert u het shader-programma uit.
Er zijn echter veel gevallen waarin u geen speciaal tekeneffect nodig heeft, en zelfs in dergelijke gevallen is een effect noodzakelijk, dus het is verrassend omslachtig om de moeite te nemen om een shader-programma te implementeren.
Daarom worden basisparameters zoals materialen en lichten van tevoren als eigenschappen voorbereid, zodat effecten gemakkelijk kunnen worden afgehandeld "BasicEffect". Het is heel eenvoudig omdat je geen effectbestand hoeft te maken, je kunt het afhandelen door simpelweg een instantie van de klasse te maken.
Zelfs als u modelgegevens uit de inhoud laadt, is BasicEffect standaard ingesteld, zodat u niet eens een exemplaar hoeft te maken.
materiaal
Materiaal verwijst voornamelijk naar de kenmerken van het materiaal van een stof en wordt gebruikt om de kleur, mate van reflectie en sterkte van de stof te specificeren. Omdat het mogelijk is geworden om het onafhankelijk uit te drukken in shader-programma's, kan de definitie van een materiaal een ruwe betekenis hebben zonder vast te staan, maar BasicEffect heeft de volgende parameters:
Alfa | Dekking. Een waarde van 1,0 geeft dekking aan en een waarde van 0,0 staat voor volledige transparantie. |
DiffuseColor | De kleur van de substantie van het weer te geven object. Geef kleuren weer in RGB. De schaduw van het materiaal wordt gereflecteerd afhankelijk van de toestand van het licht. |
EmissiveColor | De uitgestraalde kleur van het weer te geven object. Geef kleuren weer in RGB. Omdat het een kleur is die zijn eigen licht uitstraalt, wordt de kleur toegevoegd zonder te worden beïnvloed door licht. |
Spiegelende kleur | De kleur van de reflectie van het weer te geven object. Geef kleuren weer in RGB. Afhankelijk van de richting en het gezichtspunt van het licht, lijkt het materiaal te worden gereflecteerd. |
SpecularPower | De intensiteit van de reflectie van het weer te geven object. Hoe hoger de waarde, hoe kleiner het gereflecteerde gebied. |
Beeld van materiële verandering
De afbeelding hieronder toont de verschillende waarden van het materiaal.
Begintoestand
Dit is de status onmiddellijk na het laden van de voorbeeldmodelgegevens.
Alfa | 1 |
Diffuus (rood) | 0.8 |
Diffuus (groen) | 0.8 |
Diffuus (blauw) | 0 |
Emitterend (rood) | 0 |
Emitterend (groen) | 0 |
Emitterend (blauw) | 0 |
Spiegelend (rood) | 0 |
Spiegelend (groen) | 0 |
Spiegelend (blauw) | 0 |
SpecularPower | 5 |
Wijziging van dekking (alfa)
Dit is het moment waarop u de dekking wijzigt. De blauwe kleur van de achtergrond is vaag zichtbaar.
Alfa | 0.31 |
Diffuus (rood) | 0.8 |
Diffuus (groen) | 0.8 |
Diffuus (blauw) | 0 |
Emitterend (rood) | 0 |
Emitterend (groen) | 0 |
Emitterend (blauw) | 0 |
Spiegelend (rood) | 0 |
Spiegelend (groen) | 0 |
Spiegelend (blauw) | 0 |
SpecularPower | 5 |
Diffuse modificaties
De kleur van de substantie wordt veranderd om het blauwachtig te maken.
Alfa | 1 |
Diffuus (rood) | 0.05 |
Diffuus (groen) | 0.71 |
Diffuus (blauw) | 1 |
Emitterend (rood) | 0 |
Emitterend (groen) | 0 |
Emitterend (blauw) | 0 |
Spiegelend (rood) | 0 |
Spiegelend (groen) | 0 |
Spiegelend (blauw) | 0 |
SpecularPower | 5 |
Emitterende wijzigingen
De rode en blauwe elementen van Emissive worden gemaximaliseerd. Ongeacht de toestand van het licht, wordt in ieder geval de paarse toestand gehandhaafd.
Alfa | 1 |
Diffuus (rood) | 0.8 |
Diffuus (groen) | 0.8 |
Diffuus (blauw) | 0 |
Emitterend (rood) | 1 |
Emitterend (groen) | 0 |
Emitterend (blauw) | 1 |
Spiegelend (rood) | 0 |
Spiegelend (groen) | 0 |
Spiegelend (blauw) | 0 |
SpecularPower | 5 |
Spiegelende veranderingen
Door Spiegelend in te stellen, zal het materiaal reflecterend lijken.
Alfa | 1 |
Diffuus (rood) | 0.8 |
Diffuus (groen) | 0.8 |
Diffuus (blauw) | 0 |
Emitterend (rood) | 0 |
Emitterend (groen) | 0 |
Emitterend (blauw) | 0 |
Spiegelend (rood) | 1 |
Spiegelend (groen) | 1 |
Spiegelend (blauw) | 1 |
SpecularPower | 5 |
SpecularPower Modificatie
Door de SpecularPower te wijzigen, verandert het bereik van het reflecterende oppervlak.
Alfa | 1 |
Diffuus (rood) | 0.8 |
Diffuus (groen) | 0.8 |
Diffuus (blauw) | 0 |
Emitterend (rood) | 0 |
Emitterend (groen) | 0 |
Emitterend (blauw) | 0 |
Spiegelend (rood) | 1 |
Spiegelend (groen) | 1 |
Spiegelend (blauw) | 1 |
SpecularPower | 20 |
veld
Het veld bevat materiaalinformatie die moet worden ingesteld op BasicEffect. Bovendien heeft het parameters voor het selecteren van menu's, maar aangezien het alleen een parameter voor bediening is, zal ik de details weglaten.
<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;
Het materiaal van het model ophalen
De waarde van het materiaal dat in het model is ingesteld als de beginwaarde wordt opgehaald. In dit voorbeeld is de code geschreven op basis van de veronderstelling dat er slechts één effect is ingesteld in het 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;
}
}
Opzetten van het materiaal
In het voorbeeld wordt een waarde ingesteld voor het BasicEffect van het model. Voor "DiffuseColor", "EmissiveColor" en "SpecularColor", ingesteld in een Vector3, niet in een Kleurstructuur. Geef de elementen rood voor X, groen voor Y en blauw voor Z op met waarden van 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 het voorbeeld is er code zoals materiaalbewerkingscode en tekenreeksweergave van waarden, maar er zijn delen die niet direct gerelateerd zijn aan BasicMaterial, dus ik zal de uitleg weglaten. U kunt het voorbeeld downloaden of de volledige code bekijken.
BasicEffect.Alpha
eigenschap
Hiermee haalt u de dekking op en stelt u deze in. Geef een waarde op in het bereik van 0.0~1.0. | drijven | Krijgen, instellen |
BasicEffect.DiffuseColor
eigenschap
Hiermee haalt u de diffuse kleur op en stelt deze in. X is rood, Y is groen, Z is blauw en elke waarde ligt in het bereik van 0,0 ~ 1,0. | Vector 3 | Krijgen, instellen |
BasicEffect.EmissiveColor
eigenschap
Hiermee haalt u de uitgezonden kleur op en stelt u deze in. X is rood, Y is groen, Z is blauw en elke waarde ligt in het bereik van 0,0 ~ 1,0. | Vector 3 | Krijgen, instellen |
BasicEffect.SpecularColor
eigenschap
Hiermee haalt u de gereflecteerde kleur op en stelt u deze in. X is rood, Y is groen, Z is blauw en elke waarde ligt in het bereik van 0,0 ~ 1,0. | Vector 3 | Krijgen, instellen |
BasicEffect.SpecularPower
eigenschap
Haalt en stelt de intensiteit van de reflectie in. De waarde wordt opgegeven als 0.0~. | drijven | Krijgen, instellen |
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);
}
}
}