今回は、入門的なシェーダーを行います。
シェーダーでテクスチャマッピングを行います。
シェーダーでテクスチャマッピングを行うには、
テクスチャとテクスチャ座標が必要になります。
テクスチャとテクスチャ座標をシェーダーに渡してしまえば、
後は、ピクセルシェーダーで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