▼XNA Game Studioメモ▼
テクスチャ


HLSLでモデルにテクスチャを貼り付けて表示するプログラムを作成する。



リソースの追加
  1. DOGA-L2またはL3でテクスチャ付きボックスを作成。
    DOGA-L2/L3はシェアウェアだがモデルの作成は無償で利用可能。
  2. テクスチャ付ボックスとテクスチャをContentにドラッグ&ドロップし、プロパティのビルドアクションでコンパイルを指定。


エフェクトファイルの追加
エフェクトファイル「TextureEffect.fx」を作成し、Contentにドラッグ&ドロップし、プロパティのビルドアクションでコンパイルを指定。
TextureEffect.fx
float4x4 worldViewProj : WORLDVIEWPROJECTION;
texture  cubeTexture;

struct VS_INPUT {
    float4 pos      : POSITION;
    float4 texcoord : TEXCOORD0;
};

struct VS_OUTPUT {
    float4 pos      : POSITION;
    float4 texcoord : TEXCOORD0;
};

sampler textureSampler = sampler_state {
    Texture  =<cubeTexture>;
    mipfilter=LINEAR; 
};
 
VS_OUTPUT VS_TextureTech(VS_INPUT In) {
    VS_OUTPUT Out=(VS_OUTPUT)0;
    Out.pos     =mul(In.pos,worldViewProj);
    Out.texcoord=In.texcoord;
    return Out;
}

float4 PS_TextureTech(VS_OUTPUT Out) : COLOR {
    return tex2D(textureSampler,Out.texcoord).rgba;
}

technique TextureTech {
    pass P0 {
        vertexShader=compile vs_2_0 VS_TextureTech();
        pixelShader =compile ps_2_0 PS_TextureTech();
    }
}


ソースコードの編集
Game.cs
using System;
using System.Collections.Generic;
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.Net;
using Microsoft.Xna.Framework.Storage;

namespace TextureEffectEx {
    public class Game : Microsoft.Xna.Framework.Game {
        //システム
        private GraphicsDeviceManager graphics;   //グラフィックス
        private float                 aspectRatio;//アスペクト比

        //モデル
        private Model   model;  //モデル
        private Texture texture;//テクスチャ

        //エフェクト
        private Effect          effect;            //エフェクト
        private EffectParameter worldViewProjParam;//変換行列            
        
        //コンストラクタ
        public Game() {
            graphics=new GraphicsDeviceManager(this);
            Content.RootDirectory="Content";
        }

        //初期化
        protected override void Initialize() {
            base.Initialize();
        }

        //グラフィクスコンテントの読み込み
        protected override void LoadContent() {
            //アスペクト比
            aspectRatio=
                (float)GraphicsDevice.Viewport.Width/
                (float)GraphicsDevice.Viewport.Height;

            //モデルの読み込み
            model=Content.Load<Model>("box");            

            //テクスチャの読み込み
            texture=Content.Load<Texture2D>("mokume2");
            
            //エフェクトの読み込み
            effect=Content.Load<Effect>("TextureEffect");
            effect.CurrentTechnique=effect.Techniques["TextureTech"];            
            worldViewProjParam=effect.Parameters["worldViewProj"];        

            //エフェクトにテクスチャを関連付け
            effect.Parameters["cubeTexture"].SetValue(texture); 

            //モデルにエフェクトを関連付け
            foreach (ModelMesh mesh in model.Meshes) {
                for(int i=0;i<mesh.MeshParts.Count;i++) {
                    mesh.MeshParts[i].Effect=effect;
                }            
            }

            //ワールド変換行列
            Matrix world=
                Matrix.CreateTranslation(new Vector3(0.0f,0.0f,0.0f));//モデル位置
                    
            //ビュー変換行列
            Matrix view=Matrix.CreateLookAt(
                new Vector3(5.0f,5.0f,5.0f),//カメラ位置
                Vector3.Zero,               //参照点
                Vector3.Up                  //UPベクトル
            );
                    
            //射影変換行列
            Matrix projection=Matrix.CreatePerspectiveFieldOfView(
                MathHelper.ToRadians(45.0f),//視野角
                aspectRatio,                //アスペクト比
                1.0f,                       //ニアクリップ面の距離
                100.0f                      //ファークリップ面の距離
            );

            //エフェクトのコミットチェンジ
            effect.CommitChanges();

            //ワールドxビューx射影行列
            worldViewProjParam.SetValue(world*view*projection);        
        }

        //グラフィクスコンテントの解放
        protected override void UnloadContent() {
        }

        //更新
        protected override void Update(GameTime gameTime) {
            base.Update(gameTime);
        }

        //描画
        protected override void Draw(GameTime gameTime) {
            //背景色
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

            //モデルの描画
            foreach (ModelMesh mesh in model.Meshes) {
                mesh.Draw();
            }

            //ベースの描画
            base.Draw(gameTime);
        }   
    }
}


テクスチャを赤色成分のみにする


エフェクトの一部を書き換えてテクスチャを赤色成分のみしてみる。



変更点
ピクセルシェーダの処理の戻り値の緑成分(g)、青成分(b)、α成分(a)をに0を指定する。
float4 PS_TextureTech(VS_OUTPUT Out) : COLOR {
    float4 col=tex2D(textureSampler,Out.texcoord).rgba;
    col.gba=0.0f;
    return col;
}




−戻る−