//==============================================================
// 定数
float4x4 WorldViewProj;
float4x4 PreWorldVP;		//前フレームの変換マトリクス
float	tone;
float4	DLColor=(0,0,0,0);	//

texture Tex1;			//通常テクスチャ
texture Val1;		//スクリーン出力画面
texture SpeedTex;		//速度マップ
//texture ToneTex;		//光度サンプリング

//==============================================================
// テクスチャサンプラ
sampler MTex1=sampler_state {		Texture=<Tex1>;
	MipFilter=POINT;		MinFilter=POINT;	MagFilter=POINT;	AddressU=WRAP;	AddressV=WRAP;
};
sampler MTex1L=sampler_state {		Texture=<Tex1>;
	MipFilter=LINEAR;	MinFilter=LINEAR;	MagFilter=LINEAR;	AddressU=CLAMP;	AddressV=CLAMP;
};
sampler MTex2=sampler_state {		Texture=<Val1>;
	MipFilter=POINT;		MinFilter=POINT;	MagFilter=POINT;	AddressU=WRAP;	AddressV=WRAP;
};
sampler MTex2L=sampler_state {		Texture=<Val1>;
	MipFilter=LINEAR;	MinFilter=LINEAR;	MagFilter=LINEAR;	AddressU=WRAP;	AddressV=WRAP;
};
sampler SpeedSmp=sampler_state {	Texture=<SpeedTex>;
	MipFilter=POINT;		MinFilter=POINT;	MagFilter=POINT;
	AddressU=CLAMP;	AddressV=CLAMP;
};
//==============================================================

//==============================================================
//パーティクルだけはZバッファへの書き込みを行わない（Zテストは行う）
void SpeedVS (	float4 pos : POSITION,	out float4 Pos : POSITION,	out float4 Nomal : TEXCOORD0)
 {
	Pos=mul(pos,WorldViewProj);	//現在の頂点
	float4 ppos=mul(pos,PreWorldVP);	//前フレームの頂点
	Nomal.xy = Pos.xy - ppos.xy + 20.0f;	Nomal.xy /= 40.0f;
	Nomal.y = 1.0f - Nomal.y;	Nomal.z = Pos.z/Pos.w;	Nomal.w =1.0f;
}
float4 SpeedPS(	float4 Nomal : TEXCOORD0) : COLOR {	return Nomal;	}
// テクニック
technique Speed{
	pass P0 {
		VertexShader=compile vs_1_1 SpeedVS();		PixelShader=compile ps_2_0 SpeedPS();
	}
}
//==============================================================
//==============================================================
//パーティクルだけはZバッファへの書き込みを行わない（Zテストは行う）
void SpeedAVS (
	float4 pos : POSITION,		float2 mesh_uv : TEXCOORD0,
	out float4 Pos : POSITION,	out float4 Nomal : TEXCOORD0,	out float2 MeshUV : TEXCOORD1
) {
	Pos=mul(pos,WorldViewProj);	//現在の頂点
	float4 ppos=mul(pos,PreWorldVP);	//前フレームの頂点
	Nomal.xy = Pos.xy - ppos.xy + 20.0f;	Nomal.xy /= 40.0f;
	Nomal.y = 1.0f - Nomal.y;	Nomal.z = Pos.z/Pos.w;	Nomal.w =1.0f;
	//メッシュはそのまま
	MeshUV=mesh_uv;
}
float4 SpeedAPS(	float4 Nomal : TEXCOORD0 , float2 MeshUV : TEXCOORD1
) : COLOR {
	Nomal.w *= tex2D(MTex1, MeshUV).w;
	return Nomal;
}
// テクニック
technique SpeedA{
	pass P0 {
		VertexShader=compile vs_1_1 SpeedAVS();		PixelShader=compile ps_2_0 SpeedAPS();
	}
}
//==============================================================
//パーティクルだけはZバッファへの書き込みを行わない（Zテストは行う）
void SpeedMVS (
	float4 pos : POSITION,		float4  diffuse : COLOR,	out float4 Pos : POSITION,	out float4 Col : COLOR0
) {
	Pos=mul(pos,WorldViewProj);	//現在の頂点
	Col = diffuse;
}
float4 SpeedMPS(	float4 Col : COLOR0) : COLOR {	return Col ;	}
// テクニック
technique SpeedM{
	pass P0 {
		VertexShader=compile vs_1_1 SpeedMVS();	PixelShader=compile ps_2_0 SpeedMPS();
	}
}
//==============================================================

//==============================================================
//シーン
void SceneVS (
	float4 pos : POSITION,		float4  diffuse : COLOR,	float2 mesh_uv : TEXCOORD0,
	out float4 Pos : POSITION,	out float4 Col : COLOR0,	out float2 MeshUV : TEXCOORD0
) {
	// 頂点色
//	Col= DLColor * diffuse;	
	Col= diffuse;	
	// 頂点変換
	Pos=mul(pos,WorldViewProj);
	//メッシュはそのまま
	MeshUV=mesh_uv;
}
// ピクセルシェーダ
float4 ScenePS(
	float4 Col : COLOR0,	float2 MeshUV : TEXCOORD0
) : COLOR {
	// テクスチャ色と頂点色の合成
	return tex2D(MTex1, MeshUV)*Col + DLColor;
}
technique Scene {
	pass P0 {
		VertexShader=compile vs_1_1 SceneVS();		PixelShader=compile ps_2_0 ScenePS();
	}
}
//==============================================================

//==============================================================
void NoTransVS(//何も処理せずに書き出す
	float4 pos : POSITION,		float2 mesh_uv : TEXCOORD0,
	out float4 Pos : POSITION,	out float2 MeshUV : TEXCOORD0
) {
	Pos=mul(pos,WorldViewProj);	MeshUV=mesh_uv;
}
float4 NoTransPS(	float2 MeshUV : TEXCOORD0) : COLOR {		return tex2D(MTex1, MeshUV);	}
technique NoTrans {
	pass P0 {	VertexShader=compile vs_1_1 NoTransVS();	PixelShader=compile ps_2_0 NoTransPS();	}
}
float4 NoTransLPS(	float2 MeshUV : TEXCOORD0) : COLOR {		return tex2D(MTex1L, MeshUV);	}
technique NoTransL {
	pass P0 {	VertexShader=compile vs_1_1 NoTransVS();	PixelShader=compile ps_2_0 NoTransLPS();	}
}
//==============================================================

//==============================================================
float4 ToneLigPS(
	float2 uv : TEXCOORD0
) : COLOR {
	float4 Ret = tex2D(MTex1L, uv);	
	float	d = 0.299f * Ret .r + 0.587f * Ret .g + 0.114f * Ret .b;	Ret.rgb=0.0f;	Ret.r = d;	Ret.a = 1;
	return Ret;
}
technique ToneLig{	pass P0 {	VertexShader=compile vs_1_1 NoTransVS();	PixelShader=compile ps_2_0 ToneLigPS();	}	}
//==============================================================
float4 ToneSampPS(
	float2 uv : TEXCOORD0
) : COLOR {
	uv.y *= 4.0f;
	float4 Ret = tex2D(MTex1, uv);	
	Ret.r += (tex2D(MTex1, uv +float2(0 , 0.015625f)).r+tex2D(MTex1, uv +float2(0 , 0.03125f)).r+tex2D(MTex1, uv +float2(0 , 0.046875f)).r	);
	Ret.r /= 4.0f;
	return Ret;
}
technique ToneSamp{	pass P0 {	VertexShader=compile vs_1_1 NoTransVS();	PixelShader=compile ps_2_0 ToneSampPS();	}	}
//==============================================================

//==============================================================
float4 ToneRendPS(	//強光度
	float2 uv : TEXCOORD0
) : COLOR {
	float4 Ret = tex2D(MTex1L, uv);	Ret.rgb -= tone;	Ret.rgb *= 2.0f;	Ret.rgb -= 0.9f;	return Ret;
}
technique ToneRend{	pass P0 {	VertexShader=compile vs_1_1 NoTransVS();	PixelShader=compile ps_2_0 ToneRendPS();	}	}
//==============================================================

//==============================================================
float4 BloomPS(
	float2 uv : TEXCOORD0
) : COLOR {
	uv += 0.002f;
	float4 Ret = tex2D(MTex1L, uv);
	float2 dp = uv * 0.5f;	dp.y += 0.75f;		Ret += tex2D(MTex1L, dp);	// 1/2スケールのサンプル
	dp = uv * 0.25f;	dp.x += 0.75f;	dp.y += 0.875f;	Ret += tex2D(MTex1L, dp);	// 1/4スケールのサンプル
	Ret.a = 0;
	return Ret;
}
technique Bloom{	pass P0 {	VertexShader=compile vs_1_1 NoTransVS();	PixelShader=compile ps_2_0 BloomPS();	}	}
//==============================================================

//==============================================================
//simpleガウス。
float4 GausXPS(
	float2 uv : TEXCOORD0
) : COLOR {
	float4 Ret = tex2D(MTex1, uv);	
	Ret += (tex2D(MTex1L, uv-float2(0.009f , 0.0f))*0.2f);	Ret += (tex2D(MTex1L, uv+float2(0.009f , 0.0f))*0.2f);	
	Ret += (tex2D(MTex1L, uv-float2(0.006f , 0.0f))*0.5f);	Ret += (tex2D(MTex1L, uv+float2(0.006f , 0.0f))*0.5f);	
	Ret += (tex2D(MTex1L, uv-float2(0.003f , 0.0f))*0.8f);	Ret += (tex2D(MTex1L, uv+float2(0.003f , 0.0f))*0.8f);	
	return Ret/4.0f;
}
float4 GausYPS(
	float2 uv : TEXCOORD0
) : COLOR {
	float4 Ret = tex2D(MTex1, uv);	
	Ret += (tex2D(MTex1L, uv-float2(0.0f , 0.009f ))*0.2f);	Ret += (tex2D(MTex1L, uv+float2(0.0f , 0.009f ))*0.2f);	
	Ret += (tex2D(MTex1L, uv-float2(0.0f , 0.006f ))*0.5f);	Ret += (tex2D(MTex1L, uv+float2(0.0f , 0.006f ))*0.5f);	
	Ret += (tex2D(MTex1L, uv-float2(0.0f , 0.003f ))*0.8f);	Ret += (tex2D(MTex1L, uv+float2(0.0f , 0.003f ))*0.8f);	
	return Ret/4.0f;
}
// テクニック
technique GausX{	pass P0 {	VertexShader=compile vs_1_1 NoTransVS();	PixelShader=compile ps_2_0 GausXPS();	}	}
technique GausY{	pass P0 {	VertexShader=compile vs_1_1 NoTransVS();	PixelShader=compile ps_2_0 GausYPS();	}	}
//==============================================================

//==============================================================
float4 LasterPS(	float2 MeshUV : TEXCOORD0
) : COLOR {
	float2 nom=tex2D(SpeedSmp, MeshUV).xy -0.5f;
	float4 col=tex2D(MTex1, MeshUV);
	col += tex2D(MTex1, MeshUV+nom/20.0f);	col += tex2D(MTex1, MeshUV+nom/40.0f);
	col += tex2D(MTex1, MeshUV-nom/40.0f);	col += tex2D(MTex1, MeshUV-nom/20.0f);

	col *= 0.4f;	col.rgb -= tone*2.0f;	return	col;
}
technique Laster {
	pass P0 {
		VertexShader=compile vs_1_1 NoTransVS();
		PixelShader=compile ps_2_0 LasterPS();
	}
}
//==============================================================
float4 NoMotionPS(	float2 MeshUV : TEXCOORD0
) : COLOR {
	float4 col=tex2D(MTex1, MeshUV);
	col *= 2.0f;	col.rgb -= tone*2.0f;	return	col;
}
technique NoMotion{
	pass P0 {
		VertexShader=compile vs_1_1 NoTransVS();
		PixelShader=compile ps_2_0 NoMotionPS();
	}
}
//==============================================================

//==============================================================
float4 TextPS(	float2 MeshUV : TEXCOORD0
) : COLOR {	return tex2D(MTex1, MeshUV)*DLColor;	}
technique TextTec{
pass P0 {
	VertexShader=compile vs_1_1 NoTransVS();  PixelShader=compile ps_2_0 TextPS();
}
}
//==============================================================
