BasicEffect materjalid

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kokkuvõte

Manipuleerige BasicEffecti materjaliosaga seotud parameetritega, et näha, kuidas mudel välja näeb.

Töökeskkond

Eeltingimused

Toetatud XNA versioonid
  • 4.0
Toetatud platvormid
  • Windows (XP SP2 või uuem, Vista, 7)
  • Xbox 360
  • Windows Phone 7
Windowsi nõutav vertex shaderi versioon 2.0
Windowsi nõutav versioon Pixel Shader 2.0

Töökeskkond

platvorm
  • Windows 7
  • Xbox 360
  • Windows Phone 7

Kuidas prooviga töötada

Töötab klaviatuurXbox 360 kontrollermouse touch
Valige parameetrid, mida soovite muuta ↑、↓ Vasak kepp ↑, ↓ Vasak nupp -
Parameetrite muutmine ←、→ Vasak kepp ←, → ←→ Lohistamine -

aine

Mis on BasicEffect?

XNA-s, kui soovite kuvada 3D-hulknurki, peate nende joonistamiseks kirjutama varjutusprogrammi ja otsustama, kuidas neid joonistada. Selleks looge eraldi efektifail, kirjutage programm, lugege seda efektiklassina (efekt) ja käivitage varjutusprogramm.

Siiski on palju juhtumeid, kus te ei vaja spetsiaalset joonistusefekti ja isegi sellistel juhtudel on efekt vajalik, seega on üllatavalt tülikas häirida varjuprogrammi rakendamist.

Seetõttu valmistatakse põhiparameetrid, nagu materjalid ja tuled, eelnevalt omadustena ette, et efekte saaks hõlpsasti käsitseda "BasicEffect". See on väga lihtne, sest te ei pea efektifaili looma, saate sellega hakkama saada, luues lihtsalt klassi eksemplari.

Isegi kui laadite sisust mudeliandmeid, on BasicEffect vaikimisi seatud, nii et te ei pea isegi eksemplari looma.

materjal

Materjal viitab peamiselt aine materjali omadustele ja seda kasutatakse aine värvi, peegeldusastme ja tugevuse määramiseks. Kuna on muutunud võimalikuks seda iseseisvalt varjuprogrammides väljendada, võib materjali määratlusel olla töötlemata tähendus, ilma et see oleks fikseeritud, kuid BasicEffectil on järgmised parameetrid:

Alfa Läbipaistmatus. Väärtus 1,0 näitab läbipaistmatust ja väärtus 0,0 tähistab täielikku läbipaistvust.
DiffuseColor Kuvatava objekti aine värv. Värvide esitamine RGB-s. Materjali varjund peegeldub sõltuvalt valguse olekust.
EmissiveColor Kuvatava objekti kiiratud värv. Värvide esitamine RGB-s. Kuna see on värv, mis kiirgab oma valgust, lisatakse värv ilma valguse mõjutamata.
SpecularColor Kuvatava objekti peegelduse värv. Värvide esitamine RGB-s. Sõltuvalt valguse suunast ja vaatenurgast näib materjal peegelduvat.
SpecularPower Kuvatava objekti peegelduse intensiivsus. Mida suurem on väärtus, seda väiksem on peegeldunud ala.

Materjali muutuse pilt

Allolev pilt näitab materjali erinevaid väärtusi.

Esialgne olek

See on olek kohe pärast näidismudeli andmete laadimist.

初期状態

Alfa 1
Difuusne (punane) 0.8
Difuusne (roheline) 0.8
Difuusne (sinine) 0
Emissive (punane) 0
Emissiivne (roheline) 0
Emissive (sinine) 0
Specular (punane) 0
Specular (roheline) 0
Specular (sinine) 0
SpecularPower 5

Läbipaistmatuse (alfa) muutus

See on siis, kui muudate läbipaistmatust. Tausta sinine värv on nõrgalt nähtav.

不透明度(Alpha)変更

Alfa 0.31
Difuusne (punane) 0.8
Difuusne (roheline) 0.8
Difuusne (sinine) 0
Emissive (punane) 0
Emissiivne (roheline) 0
Emissive (sinine) 0
Specular (punane) 0
Specular (roheline) 0
Specular (sinine) 0
SpecularPower 5

Difuussed muudatused

Aine värvi muudetakse, et muuta see sinakaseks.

Diffuse 変更

Alfa 1
Difuusne (punane) 0.05
Difuusne (roheline) 0.71
Difuusne (sinine) 1
Emissive (punane) 0
Emissiivne (roheline) 0
Emissive (sinine) 0
Specular (punane) 0
Specular (roheline) 0
Specular (sinine) 0
SpecularPower 5

Emissiivsed muudatused

Emissive'i punased ja sinised elemendid on maksimeeritud. Sõltumata valguse olekust säilitatakse vähemalt lilla olek.

Emissive 変更

Alfa 1
Difuusne (punane) 0.8
Difuusne (roheline) 0.8
Difuusne (sinine) 0
Emissive (punane) 1
Emissiivne (roheline) 0
Emissive (sinine) 1
Specular (punane) 0
Specular (roheline) 0
Specular (sinine) 0
SpecularPower 5

Spekulatiivsed muutused

Speculari seadistamisel tundub materjal peegeldav.

Specular 変更

Alfa 1
Difuusne (punane) 0.8
Difuusne (roheline) 0.8
Difuusne (sinine) 0
Emissive (punane) 0
Emissiivne (roheline) 0
Emissive (sinine) 0
Specular (punane) 1
Specular (roheline) 1
Specular (sinine) 1
SpecularPower 5

SpecularPoweri muutmine

SpecularPoweri muutmine muudab peegeldava pinna ulatust.

SpecularPower 変更

Alfa 1
Difuusne (punane) 0.8
Difuusne (roheline) 0.8
Difuusne (sinine) 0
Emissive (punane) 0
Emissiivne (roheline) 0
Emissive (sinine) 0
Specular (punane) 1
Specular (roheline) 1
Specular (sinine) 1
SpecularPower 20

põld

Väljal on materiaalne teave, mida saab seada väärtusele BasicEffect. Lisaks on sellel parameetrid menüüde valimiseks, kuid kuna see on ainult tööparameeter, jätan üksikasjad välja.

/// <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;

Mudeli materjali hankimine

Tuuakse mudelis algväärtusena määratud materjali väärtus. Selles proovis on kood kirjutatud eeldusel, et mudelis on ainult üks efekt.

// ライトとビュー、プロジェクションはあらかじめ設定しておく
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;
    }
}

Materjali seadistamine

Näidis määrab mudeli väärtuseks BasicEffect. "DiffuseColor", "EmissiveColor" ja "SpecularColor" puhul, mis on seatud vektorisse3, mitte värvistruktuuri. Määrake punased elemendid X jaoks, roheline Y jaoks ja sinine Z jaoks väärtustega 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;
    }
}

Proovis on kood, näiteks materjali operatsioonikood ja stringide kuvamine, kuid on osi, mis ei ole otseselt seotud BasicMaterialiga, nii et ma jätan selgituse välja. Võite alla laadida proovi või vaadata kogu koodi.

BasicEffect.Alpha vara

Saab ja seab läbipaistmatuse. Määrake väärtus vahemikus 0,0 ~ 1,0. Float hankige, seadke

BasicEffect.DiffuseColor vara

Saab ja määrab hajusa värvi. X on punane, Y on roheline, Z on sinine ja iga väärtus on vahemikus 0,0 ~ 1,0. Vektor3 hankige, seadke

BasicEffect.EmissiveColor vara

Saab ja määrab eralduva värvi. X on punane, Y on roheline, Z on sinine ja iga väärtus on vahemikus 0,0 ~ 1,0. Vektor3 hankige, seadke

BasicEffect.SpecularColor vara

Saab ja määrab peegeldunud värvi. X on punane, Y on roheline, Z on sinine ja iga väärtus on vahemikus 0,0 ~ 1,0. Vektor3 hankige, seadke

BasicEffect.SpecularPower vara

Saab ja määrab peegelduse intensiivsuse. Väärtuseks on määratud 0,0~. Float hankige, seadke

Kõik koodid

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);
        }
    }
}