BasicEffect-materiaalit
yhteenveto
Käsittele BasicEffectin materiaaliosaan liittyviä parametreja nähdäksesi, miltä malli näyttää.
Toimintaympäristö
Edellytykset
Tuetut XNA-versiot |
|
Tuetut alustat |
|
Windowsin vaatima Vertex Shader -versio | 2.0 |
Windowsin vaatima Pixel Shader -versio | 2.0 |
Toimintaympäristö
lava |
|
Kuinka työskennellä näytteen kanssa
Toimii näppäimistöXbox | 360 -ohjainhiiren | kosketus | ||
---|---|---|---|---|
Valitse muutettavat parametrit | ↑、↓ | Vasen sauva ↑, ↓ | Vasen painike | - |
Parametrien muuttaminen | ←、→ | Vasen sauva ←, → | ←→ Vedä | - |
aine
Mikä on BasicEffect?
XNA: ssa, jos haluat näyttää 3D-monikulmioita, sinun on kirjoitettava varjostinohjelma piirtääksesi ne ja päättääksesi, miten ne piirretään. Voit tehdä tämän luomalla erillisen tehostetiedoston, kirjoittamalla ohjelman, lukemalla sen tehosteluokkana (vaikutus) ja suorittamalla varjostinohjelman.
On kuitenkin monia tapauksia, joissa et tarvitse erityistä piirustustehostetta, ja jopa tällaisissa tapauksissa tehoste on välttämätön, joten varjostinohjelman toteuttaminen on yllättävän hankalaa.
Siksi perusparametrit, kuten materiaalit ja valot, valmistellaan ominaisuuksina etukäteen, jotta tehosteita voidaan helposti käsitellä "BasicEffect". Se on erittäin helppoa, koska sinun ei tarvitse luoda tehostetiedostoa, voit käsitellä sitä yksinkertaisesti luomalla luokan esiintymän.
Vaikka lataat mallitiedot sisällöstä, BasicEffect on oletusarvoisesti asetettu, joten sinun ei tarvitse edes luoda esiintymää.
materiaali
Materiaali viittaa pääasiassa aineen materiaalin ominaisuuksiin, ja sitä käytetään määrittämään aineen väri, heijastusaste ja lujuus. Koska se on tullut mahdolliseksi ilmaista itsenäisesti varjostinohjelmissa, materiaalin määritelmällä voi olla karkea merkitys ilman kiinteää, mutta BasicEffectillä on seuraavat parametrit:
Alfa | Läpikuultamattomuus. Arvo 1,0 tarkoittaa peittävyyttä ja arvo 0,0 edustaa täydellistä läpinäkyvyyttä. |
DiffuseColor | Näytettävän objektin aineen väri. Esitä värit RGB-muodossa. Materiaalin varjostus heijastuu valon tilasta riippuen. |
EmissiveColor | Näytettävän objektin emittoitu väri. Esitä värit RGB-muodossa. Koska se on väri, joka säteilee omaa valoaan, väri lisätään ilman valon vaikutusta. |
SpecularColor | Näytettävän kohteen heijastuksen väri. Esitä värit RGB-muodossa. Valon suunnasta ja näkökulmasta riippuen materiaali näyttää heijastuvan. |
SpecularPower | Näytettävän kohteen heijastuksen voimakkuus. Mitä suurempi arvo, sitä pienempi alue heijastuu. |
Kuva olennaisesta muutoksesta
Alla olevassa kuvassa näkyvät materiaalin eri arvot.
Alkutila
Tämä on tila heti mallimallin tietojen lataamisen jälkeen.
Alfa | 1 |
Diffuusi (punainen) | 0.8 |
Diffuusi (vihreä) | 0.8 |
diffuusi (sininen) | 0 |
Emissiivinen (punainen) | 0 |
Emissiivinen (vihreä) | 0 |
Emissiivinen (sininen) | 0 |
Specular (punainen) | 0 |
Specular (vihreä) | 0 |
Specular (sininen) | 0 |
SpecularPower | 5 |
Peittävyyden (alfa) muutos
Tällöin muutat peittävyyttä. Taustan sininen väri näkyy heikosti.
Alfa | 0.31 |
Diffuusi (punainen) | 0.8 |
Diffuusi (vihreä) | 0.8 |
diffuusi (sininen) | 0 |
Emissiivinen (punainen) | 0 |
Emissiivinen (vihreä) | 0 |
Emissiivinen (sininen) | 0 |
Specular (punainen) | 0 |
Specular (vihreä) | 0 |
Specular (sininen) | 0 |
SpecularPower | 5 |
Diffuusi muutokset
Aineen väri muuttuu sinertäväksi.
Alfa | 1 |
Diffuusi (punainen) | 0.05 |
Diffuusi (vihreä) | 0.71 |
diffuusi (sininen) | 1 |
Emissiivinen (punainen) | 0 |
Emissiivinen (vihreä) | 0 |
Emissiivinen (sininen) | 0 |
Specular (punainen) | 0 |
Specular (vihreä) | 0 |
Specular (sininen) | 0 |
SpecularPower | 5 |
Emissiiviset muutokset
Emissiivin punaiset ja siniset elementit maksimoidaan. Valon tilasta riippumatta ainakin violetti tila säilyy.
Alfa | 1 |
Diffuusi (punainen) | 0.8 |
Diffuusi (vihreä) | 0.8 |
diffuusi (sininen) | 0 |
Emissiivinen (punainen) | 1 |
Emissiivinen (vihreä) | 0 |
Emissiivinen (sininen) | 1 |
Specular (punainen) | 0 |
Specular (vihreä) | 0 |
Specular (sininen) | 0 |
SpecularPower | 5 |
Spekulaariset muutokset
Kun asetat Specularin, materiaali näyttää heijastavalta.
Alfa | 1 |
Diffuusi (punainen) | 0.8 |
Diffuusi (vihreä) | 0.8 |
diffuusi (sininen) | 0 |
Emissiivinen (punainen) | 0 |
Emissiivinen (vihreä) | 0 |
Emissiivinen (sininen) | 0 |
Specular (punainen) | 1 |
Specular (vihreä) | 1 |
Specular (sininen) | 1 |
SpecularPower | 5 |
SpecularPower-modifikaatio
SpecularPowerin muuttaminen muuttaa heijastavan pinnan aluetta.
Alfa | 1 |
Diffuusi (punainen) | 0.8 |
Diffuusi (vihreä) | 0.8 |
diffuusi (sininen) | 0 |
Emissiivinen (punainen) | 0 |
Emissiivinen (vihreä) | 0 |
Emissiivinen (sininen) | 0 |
Specular (punainen) | 1 |
Specular (vihreä) | 1 |
Specular (sininen) | 1 |
SpecularPower | 20 |
pelto
Kentässä on olennaisia tietoja, joiden arvoksi määritetään BasicEffect. Lisäksi siinä on parametrit valikoiden valitsemiseksi, mutta koska se on vain toimintaparametri, jätän yksityiskohdat pois.
<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;
Mallin materiaalin hakeminen
Malliin asetetun materiaalin arvo alkuarvona noudetaan. Tässä esimerkissä koodi on kirjoitettu olettaen, että mallissa on vain yksi vaikutusjoukko.
// ライトとビュー、プロジェクションはあらかじめ設定しておく
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;
}
}
Materiaalin asettaminen
Esimerkki määrittää arvon mallin BasicEffectille. "DiffuseColor", "EmissiveColor" ja "SpecularColor", asetettu Vector3:een, ei värirakenteeseen. Määritä punaiset elementit X: lle, vihreä Y: lle ja sininen Z: lle arvoilla 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;
}
}
Näytteessä on koodi, kuten materiaalin toimintakoodi ja arvojen merkkijononäyttö, mutta on osia, jotka eivät liity suoraan BasicMaterialiin, joten jätän selityksen pois. Voit ladata näytteen tai tarkistaa koko koodin.
BasicEffect.Alpha
ominaisuus
Saa ja asettaa peittävyyden. Määritä arvo välillä 0,0 ~ 1,0. | kellua | Hanki, aseta |
BasicEffect.DiffuseColor
ominaisuus
Hakee ja asettaa hajavärin. X on punainen, Y on vihreä, Z on sininen ja jokainen arvo on alueella 0.0 ~ 1.0. | Vektori 3 | Hanki, aseta |
BasicEffect.EmissiveColor
ominaisuus
Hanki ja asettaa emittoidun värin. X on punainen, Y on vihreä, Z on sininen ja jokainen arvo on alueella 0.0 ~ 1.0. | Vektori 3 | Hanki, aseta |
BasicEffect.SpecularColor
ominaisuus
Hakee ja asettaa heijastuneen värin. X on punainen, Y on vihreä, Z on sininen ja jokainen arvo on alueella 0.0 ~ 1.0. | Vektori 3 | Hanki, aseta |
BasicEffect.SpecularPower
ominaisuus
Saa ja asettaa heijastuksen voimakkuuden. Arvoksi määritetään 0,0~. | kellua | Hanki, aseta |
Kaikki koodit
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);
}
}
}