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;
namespace
BasicEffectTest1
{
public
class
Game1 :
Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager
graphics;
SpriteBatch spriteBatch;
// モデルの宣言
private
Model myModel;
//
テクスチャの宣言
private
Texture2D myTexture;
//
カスタムエフェクトの宣言
private
Effect myEffect;
public Game1()
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);