2010/01/19 Na-7
 

技術資料一覧に戻る

 

XNAのBasicEffectをカスタマイズ可能とする

 

注意 この資料は、筆者が自らの経験を記録したものであり、他人に勧めるものではありません。

この資料を参考として行った行為がいかなる結果になろうとも、筆者は責任を負いませんので予めご承知おきください。

 

◎目次

◎概要
◎使用ツール
◎サンプルコードの利用手順
◎サンプルコード

 

 

◎概要

XNAのBasicEffectで狙い通りの表示ができない場合、カスタムエフェクトを作成する必要がある。

しかしカスタムエフェクトを0から作ろうとすると大変なので、BasicEffectを少しだけカスタマイズしたいと思うことが多い。

 

BasicEffectはこちらでソースが公開されているので、このソースをカスタマイズすることができる。

ここでは、カスタマイズしたBasicEffectを自作モデルに適用するサンプルコードを紹介する。

 

 

◎使用ツール

ツール名 入手元
XNA3.0(XNA GameStudio 3.0:ゲーム開発用フレームワーク) http://msdn.microsoft.com/ja-jp/xna/default.aspx

 

 

◎サンプルコードの利用手順

1.XNAの新規プロジェクトを作成する(プロジェクト名は任意)

2.Game1.csを開き、サンプルコードを上書きして書き替える

3.namespace を手順1で指定したプロジェクト名に書き替える

4.こちらからBasicEffect.fxを入手し、ソリューションエクスプローラのContentフォルダに追加する

5.任意のモデルとテクスチャを用意し、ソリューションエクスプローラのContentフォルダに追加する
(注:テクスチャが張り付けられたモデルを使用すること)

6.モデルとテクスチャの呼び出し部分のアセット名を、手順4で指定したアセット名に書き替える

7.ビルド&実行

8.BasicEffect.fxを適当にカスタマイズしてビルド&実行し、反映されたか確認する

 

 

◎サンプルコード

 

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;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;


namespace BasicEffectTest1
{
    public class Game1 : Microsoft.Xna.Framework.Game
   
{
       
GraphicsDeviceManager graphics;
       
SpriteBatch spriteBatch;

        // モデルの宣言
       
private Model myModel;

        // テクスチャの宣言
       
private Texture2D myTexture;

        // カスタムエフェクトの宣言
       
private Effect myEffect;

        public Game1()
        {
            graphics =
new GraphicsDeviceManager(this);
            Content.RootDirectory =
"Content";
        }

        protected override void Initialize()
        {
            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch =
new SpriteBatch(GraphicsDevice);

            // モデルの呼び出し
            myModel = Content.Load<Model>("MyModel");

            // テクスチャの呼び出し
            myTexture = Content.Load<Texture2D>("MyTexture");

            // カスタムエフェクトの呼び出し
            myEffect = Content.Load<Effect>("BasicEffect");
        }

        protected override void UnloadContent()
        {
        }

        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
               
this.Exit();

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(
Color.CornflowerBlue);

            // ワールド座標変換行列
           
float time = (float)gameTime.TotalGameTime.TotalSeconds;
           
Matrix world = Matrix.CreateScale(100.0f) *
               
Matrix.CreateRotationX(time * 0.3f) *
               
Matrix.CreateRotationY(time) *
               
Matrix.CreateTranslation(Vector3.Zero);

            // ビュー座標変換行列
           
Matrix view = Matrix.CreateLookAt(
               
new Vector3(0, 0, 400),
               
Vector3.Zero,
               
Vector3.Up);

            // 射影変換行列
           
Viewport viewport = graphics.GraphicsDevice.Viewport;
           
float aspectRatio = (float)viewport.Width / (float)viewport.Height;
           
Matrix projection = Matrix.CreatePerspectiveFieldOfView(
               
MathHelper.PiOver4,
                aspectRatio,
                10, 1000);

            // ワールド、ビュー、射影変換行列の設定
            myEffect.Parameters["World"].SetValue(world);
            myEffect.Parameters[
"View"].SetValue(view);
            myEffect.Parameters[
"Projection"].SetValue(projection);

            // 描画モードを「Textured」に設定(BasicEffect Shader付属ドキュメント参照)
            myEffect.Parameters["ShaderIndex"].SetValue(2);
            myEffect.Parameters[
"BasicTexture"].SetValue(myTexture);

            // 各モデルメッシュパートが所持しているエフェクトをカスタムエフェクトに差し替える
           
foreach (ModelMesh mesh in myModel.Meshes)
            {
               
foreach (ModelMeshPart modelMeshPart in mesh.MeshParts)
                {
                    modelMeshPart.Effect = myEffect;
                }
               
// モデルを描画する
                mesh.Draw();
            }

            base.Draw(gameTime);
        }
    }
}

 

inserted by FC2 system