TextureMap

今回は、入門的なシェーダーを行います。

シェーダーでテクスチャマッピングを行います。

シェーダーでテクスチャマッピングを行うには、

テクスチャとテクスチャ座標が必要になります。

テクスチャとテクスチャ座標をシェーダーに渡してしまえば、
後は、ピクセルシェーダーでtex2Dという関数を使いポリゴンに貼り付けるだけです。

テクスチャの読み込み用の補助クラスをトゥーンの最後のほうに置いてあるのでzipをダウンロードして
フォルダ内のTGATexture.hとTGATexture.cppをプロジェクトに追加してください。

テクスチャの読み込みやテクスチャをシェーダーに渡す方法などは、トゥーンシェーダーを参考にしてください。

今までどおりにトーラスを表示するとテクスチャは張られないので今回は
板ポリゴンを表示してテクスチャを張りますので描画部分のトーラスを表示する関数を以下のように修正してください。

修正部分

 cgSetPassState( pass );
 {
  glBegin( GL_QUADS );
  glNormal3f( 0.0f, 0.0f, 1.0f );
  glTexCoord2f( 0.0f, 0.0f );
  glVertex3f( -1.0f, 1.0f, 0.0f );
  glTexCoord2f( 0.0f, 1.0f );
  glVertex3f( -1.0f, -1.0f, 0.0f );
  glTexCoord2f( 1.0f, 1.0f );
  glVertex3f( 1.0f, -1.0f, 0.0f );
  glTexCoord2f( 1.0f, 0.0f );
  glVertex3f( 1.0f, 1.0f, 0.0f );
  glEnd();
 }
 //パスのリセット
 cgResetPassState( pass );


以下実装
//グローバル変数宣言
float4x4 world;      //ワールド行列
float4x4 view;       //ビュー行列
float4x4 projection; //プロジェクション行列 
sampler2D base;      //テクスチャ
 
//入力頂点構造体
struct VS_INPUT
{
	float4 position : POSITION;  //頂点座標
	float3 normal   : NORMAL;	 //法線ベクトル
	float2 texcoord : TEXCOORD0; //テクスチャ座標
	float4 color	: COLOR00;   //色
};
 
//出力頂点構造体
struct VS_OUTPUT
{
	float4 position  : POSITION;  //頂点座標
	float3 normal	 : TEXCOORD1; //法線ベクトル
	float2 texcoord  : TEXCOORD0; //テクスチャ座標
	float4 color	 : COLOR0;    //色
};
 
//頂点シェーダー
VS_OUTPUT vs_main(
	VS_INPUT input,
	uniform float4x4 world,
	uniform float4x4 view,
	uniform float4x4 projection
)
{
	VS_OUTPUT output;
	
	float4x4 WV = mul( world, view );
 
	//法線ベクトルの座標変換
	output.normal = mul(input.normal,(float3x3)WV);
	
	float4x4 WVP = mul( WV, projection );
	
	//頂点座標の座標変換
	output.position = mul(input.position,WVP);
	
	//テクスチャ座標を設定
	output.texcoord = input.texcoord;
	
	//色を設定
	output.color = input.color;
		
	return output;
}
 
//入力ピクセル構造体
struct PS_INPUT
{
	float2 texcoord : TEXCOORD0; //テクスチャ座標
	float4 color	: COLOR0;    //色
};
 
float4 ps_main( 
	PS_INPUT input,
	uniform sampler2D base
) : COLOR0
{
	return tex2D( base, input.texcoord ) * input.color;
}
 
technique texturemapping
{	
	//パスの指定
	pass Pass_0
	{
		VertexProgram = compile arbvp1 vs_main( world,view, projection );
		FragmentProgram = compile arbfp1 ps_main( base );
	}
}

以下のように表示されると思います。
最終更新:2009年04月01日 14:42
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。