//================================================================ //大域設定値 //Texture sampler sampler0_ : register(s0); //-------------------------------- //マスク用テクスチャ //画面幅(マスクテクスチャサイズ) const float SCREEN_WIDTH = 640; const float SCREEN_HEIGHT = 480; texture textureMask_; sampler samplerMask_ = sampler_state { Texture = ; }; //================================================================ //-------------------------------- //ピクセルシェーダ入力値 struct PS_INPUT { float4 diffuse : COLOR0; //ディフューズ色 float2 texCoord : TEXCOORD0; //テクスチャ座標 float2 vPos : VPOS; //描画先座標 }; //-------------------------------- //ピクセルシェーダ出力値 struct PS_OUTPUT { float4 color : COLOR0; //出力色 }; //================================================================ // シェーダ //-------------------------------- //ピクセルシェーダ PS_OUTPUT PsMask( PS_INPUT In ) : COLOR0 { PS_OUTPUT Out; //テクスチャの色 float4 colorTexture = tex2D(sampler0_, In.texCoord); //頂点ディフーズ色 float4 colorDiffuse = In.diffuse; //合成 float4 color = colorTexture * colorDiffuse; Out.color = color; if(color.a > 0) { //-------------------------------- //マスク用のテクスチャから色成分を取得 //UVでの位置は画像ファイルの横幅と高さからの割合 //例えば、640x480の画像の位置(320,240)はUVでは0.5,0.5になる。 float2 maskUV; //描画先からマスク用テクスチャの位置を計算 maskUV.x = In.vPos.x / SCREEN_WIDTH; maskUV.y = In.vPos.y / SCREEN_HEIGHT; float4 colorMask = tex2D(samplerMask_, maskUV); //マスクのRGB値を出力結果のα値として合成する Out.color.a = ( colorMask.r + colorMask.g + colorMask.b ) * 0.3333f * color.a; } return Out; } //================================================================ //-------------------------------- //technique technique TecMask { pass P0 { PixelShader = compile ps_3_0 PsMask(); } }