// ------------------------------------------------------------- // °¡¿ì½ºÇÊÅÍ // // Copyright (c) 2003 IMAGIRE Takashi. All rights reserved. // ------------------------------------------------------------- // ------------------------------------------------------------- // Àü¿ªº¯¼ö // ------------------------------------------------------------- float MAP_WIDTH; float MAP_HEIGHT; float weight[8]; float2 offsetX; float2 offsetY; // ------------------------------------------------------------- // ÅØ½ºÃ³ // ------------------------------------------------------------- texture SrcMap; sampler SrcSamp = sampler_state { Texture = ; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; AddressU = Clamp; AddressV = Clamp; }; // ------------------------------------------------------------- // Á¤Á¡¼ÎÀÌ´õ¿¡¼­ Çȼ¿¼ÎÀÌ´õ·Î ³Ñ±â´Â µ¥ÀÌÅÍ // ------------------------------------------------------------- struct VS_OUTPUT { float4 Pos : POSITION; float2 Tex0 : TEXCOORD0; float2 Tex1 : TEXCOORD1; float2 Tex2 : TEXCOORD2; float2 Tex3 : TEXCOORD3; float2 Tex4 : TEXCOORD4; float2 Tex5 : TEXCOORD5; float2 Tex6 : TEXCOORD6; float2 Tex7 : TEXCOORD7; }; // ------------------------------------------------------------- // X¹¶°³±â // ------------------------------------------------------------- // ------------------------------------------------------------- // Á¤Á¡¼ÎÀÌ´õ // ------------------------------------------------------------- VS_OUTPUT VS_pass1 ( float4 Pos : POSITION, // ¸ðµ¨Á¤Á¡ float4 Tex : TEXCOORD0 // ÅØ½ºÃ³ÁÂÇ¥ ){ VS_OUTPUT Out = (VS_OUTPUT)0; // Ãâ·Âµ¥ÀÌÅÍ // À§Ä¡ÁÂÇ¥ Out.Pos = Pos; Out.Tex0 = Tex + float2( - 1.0f/MAP_WIDTH, 0.0f ); Out.Tex1 = Tex + float2( - 3.0f/MAP_WIDTH, 0.0f ); Out.Tex2 = Tex + float2( - 5.0f/MAP_WIDTH, 0.0f ); Out.Tex3 = Tex + float2( - 7.0f/MAP_WIDTH, 0.0f ); Out.Tex4 = Tex + float2( - 9.0f/MAP_WIDTH, 0.0f ); Out.Tex5 = Tex + float2( -11.0f/MAP_WIDTH, 0.0f ); Out.Tex6 = Tex + float2( -13.0f/MAP_WIDTH, 0.0f ); Out.Tex7 = Tex + float2( -15.0f/MAP_WIDTH, 0.0f ); return Out; } // ------------------------------------------------------------- // Çȼ¿¼ÎÀÌ´õ // ------------------------------------------------------------- float4 PS_pass1(VS_OUTPUT In) : COLOR { float4 Color; Color = weight[0] * (tex2D( SrcSamp, In.Tex0 ) + tex2D( SrcSamp, In.Tex7 + offsetX )); Color += weight[1] * (tex2D( SrcSamp, In.Tex1 ) + tex2D( SrcSamp, In.Tex6 + offsetX )); Color += weight[2] * (tex2D( SrcSamp, In.Tex2 ) + tex2D( SrcSamp, In.Tex5 + offsetX )); Color += weight[3] * (tex2D( SrcSamp, In.Tex3 ) + tex2D( SrcSamp, In.Tex4 + offsetX )); Color += weight[4] * (tex2D( SrcSamp, In.Tex4 ) + tex2D( SrcSamp, In.Tex3 + offsetX )); Color += weight[5] * (tex2D( SrcSamp, In.Tex5 ) + tex2D( SrcSamp, In.Tex2 + offsetX )); Color += weight[6] * (tex2D( SrcSamp, In.Tex6 ) + tex2D( SrcSamp, In.Tex1 + offsetX )); Color += weight[7] * (tex2D( SrcSamp, In.Tex7 ) + tex2D( SrcSamp, In.Tex0 + offsetX )); return Color; } // ------------------------------------------------------------- // Y¹¶°³±â // ------------------------------------------------------------- // ------------------------------------------------------------- // Á¤Á¡¼ÎÀÌ´õ // ------------------------------------------------------------- VS_OUTPUT VS_pass2 ( float4 Pos : POSITION, // ¸ðµ¨Á¤Á¡ float4 Tex : TEXCOORD0 // ÅØ½ºÃ³ÁÂÇ¥ ){ VS_OUTPUT Out = (VS_OUTPUT)0; // Ãâ·Âµ¥ÀÌÅÍ // À§Ä¡ÁÂÇ¥ Out.Pos = Pos; Out.Tex0 = Tex + float2( 0.0f, - 1.0f/MAP_HEIGHT ); Out.Tex1 = Tex + float2( 0.0f, - 3.0f/MAP_HEIGHT ); Out.Tex2 = Tex + float2( 0.0f, - 5.0f/MAP_HEIGHT ); Out.Tex3 = Tex + float2( 0.0f, - 7.0f/MAP_HEIGHT ); Out.Tex4 = Tex + float2( 0.0f, - 9.0f/MAP_HEIGHT ); Out.Tex5 = Tex + float2( 0.0f, -11.0f/MAP_HEIGHT ); Out.Tex6 = Tex + float2( 0.0f, -13.0f/MAP_HEIGHT ); Out.Tex7 = Tex + float2( 0.0f, -15.0f/MAP_HEIGHT ); return Out; } // ------------------------------------------------------------- // Çȼ¿¼ÎÀÌ´õ // ------------------------------------------------------------- float4 PS_pass2(VS_OUTPUT In) : COLOR { float4 Color; Color = weight[0] * (tex2D( SrcSamp, In.Tex0 ) + tex2D( SrcSamp, In.Tex7 + offsetY )); Color += weight[1] * (tex2D( SrcSamp, In.Tex1 ) + tex2D( SrcSamp, In.Tex6 + offsetY )); Color += weight[2] * (tex2D( SrcSamp, In.Tex2 ) + tex2D( SrcSamp, In.Tex5 + offsetY )); Color += weight[3] * (tex2D( SrcSamp, In.Tex3 ) + tex2D( SrcSamp, In.Tex4 + offsetY )); Color += weight[4] * (tex2D( SrcSamp, In.Tex4 ) + tex2D( SrcSamp, In.Tex3 + offsetY )); Color += weight[5] * (tex2D( SrcSamp, In.Tex5 ) + tex2D( SrcSamp, In.Tex2 + offsetY )); Color += weight[6] * (tex2D( SrcSamp, In.Tex6 ) + tex2D( SrcSamp, In.Tex1 + offsetY )); Color += weight[7] * (tex2D( SrcSamp, In.Tex7 ) + tex2D( SrcSamp, In.Tex0 + offsetY )); return Color; } // ------------------------------------------------------------ // Á¤Á¡¼ÎÀÌ´õ // ------------------------------------------------------------ VS_OUTPUT VS ( float4 Pos : POSITION, // ¸ðµ¨Á¤Á¡ float4 Tex : TEXCOORD0 // ÅØ½ºÃ³ÁÂÇ¥ ){ VS_OUTPUT Out = (VS_OUTPUT)0; // Ãâ·Âµ¥ÀÌÅÍ // À§Ä¡ÁÂÇ¥ Out.Pos = Pos; Out.Tex0 = Tex + float2(3.0f/MAP_WIDTH, -3.0f/MAP_HEIGHT); Out.Tex1 = Tex + float2(3.0f/MAP_WIDTH, -1.0f/MAP_HEIGHT); Out.Tex2 = Tex + float2(3.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT); Out.Tex3 = Tex + float2(3.0f/MAP_WIDTH, +3.0f/MAP_HEIGHT); Out.Tex4 = Tex + float2(1.0f/MAP_WIDTH, -3.0f/MAP_HEIGHT); Out.Tex5 = Tex + float2(1.0f/MAP_WIDTH, -1.0f/MAP_HEIGHT); Out.Tex6 = Tex + float2(1.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT); Out.Tex7 = Tex + float2(1.0f/MAP_WIDTH, +3.0f/MAP_HEIGHT); return Out; } // ------------------------------------------------------------ // Çȼ¿¼ÎÀÌ´õ // ------------------------------------------------------------ float4 PS ( VS_OUTPUT In ) : COLOR0 { float4 t0 = tex2D(SrcSamp, In.Tex0); float4 t1 = tex2D(SrcSamp, In.Tex1); float4 t2 = tex2D(SrcSamp, In.Tex2); float4 t3 = tex2D(SrcSamp, In.Tex3); float4 t4 = tex2D(SrcSamp, In.Tex4); float4 t5 = tex2D(SrcSamp, In.Tex5); float4 t6 = tex2D(SrcSamp, In.Tex6); float4 t7 = tex2D(SrcSamp, In.Tex7); float4 t8 = tex2D(SrcSamp, In.Tex0 + float2(-4.0f/MAP_WIDTH, 0)); float4 t9 = tex2D(SrcSamp, In.Tex1 + float2(-4.0f/MAP_WIDTH, 0)); float4 ta = tex2D(SrcSamp, In.Tex2 + float2(-4.0f/MAP_WIDTH, 0)); float4 tb = tex2D(SrcSamp, In.Tex3 + float2(-4.0f/MAP_WIDTH, 0)); float4 tc = tex2D(SrcSamp, In.Tex4 + float2(-4.0f/MAP_WIDTH, 0)); float4 td = tex2D(SrcSamp, In.Tex5 + float2(-4.0f/MAP_WIDTH, 0)); float4 te = tex2D(SrcSamp, In.Tex6 + float2(-4.0f/MAP_WIDTH, 0)); float4 tf = tex2D(SrcSamp, In.Tex7 + float2(-4.0f/MAP_WIDTH, 0)); return ((t0+t1+t2+t3) +(t4+t5+t6+t7) +(t8+t9+ta+tb) +(tc+td+te+tf))/16; } // ------------------------------------------------------------ // Á¤Á¡¼ÎÀÌ´õ¿¡¼­ Çȼ¿¼ÎÀÌ´õ·Î ³Ñ±â´Â µ¥ÀÌÅÍ // ------------------------------------------------------------ struct VS_OUTPUT4 { float4 Pos : POSITION; float2 Tex0 : TEXCOORD0; float2 Tex1 : TEXCOORD1; float2 Tex2 : TEXCOORD2; float2 Tex3 : TEXCOORD3; }; // ------------------------------------------------------------ // Á¤Á¡¼ÎÀÌ´õ // ------------------------------------------------------------ VS_OUTPUT4 VS4 ( float4 Pos : POSITION // ¸ðµ¨Á¤Á¡ ,float4 Tex : TEXCOORD0 // ÅØ½ºÃ³ÁÂÇ¥ ){ VS_OUTPUT4 Out = (VS_OUTPUT4)0; // Ãâ·Âµ¥ÀÌÅÍ // À§Ä¡ÁÂÇ¥ Out.Pos = Pos; Out.Tex0 = Tex + float2(-1.0f/MAP_WIDTH, -1.0f/MAP_HEIGHT); Out.Tex1 = Tex + float2(+1.0f/MAP_WIDTH, -1.0f/MAP_HEIGHT); Out.Tex2 = Tex + float2(-1.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT); Out.Tex3 = Tex + float2(+1.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT); return Out; } // ------------------------------------------------------------ // Çȼ¿¼ÎÀÌ´õ // ------------------------------------------------------------ PixelShader PS4 = asm { ps_1_1 def c0, 0.5, 0.5, 0.5, 0.5 tex t0 tex t1 tex t2 tex t3 lrp r0, c0, t0, t1 ; r0 = (t0+t1)/2 lrp r1, c0, t2, t3 ; r1 = (t2+t3)/2 lrp r0, c0, r0, r1 ; out = (t0+t1+t2+t3)/4 }; // ------------------------------------------------------------ // 9ÄÜ ÇÊÅÍ »ùÇøµ // ------------------------------------------------------------ VS_OUTPUT4 VS9 ( float4 Pos : POSITION // ¸ðµ¨Á¤Á¡ ,float4 Tex : TEXCOORD0 // ÅØ½ºÃ³ÁÂÇ¥ ){ VS_OUTPUT4 Out = (VS_OUTPUT4)0; // Ãâ·Âµ¥ÀÌÅÍ // À§Ä¡ÁÂÇ¥ Out.Pos = Pos; Out.Tex0 = Tex + float2( 0.0f/MAP_WIDTH, 0.0f/MAP_HEIGHT); Out.Tex1 = Tex + float2(+1.0f/MAP_WIDTH, 0.0f/MAP_HEIGHT); Out.Tex2 = Tex + float2( 0.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT); Out.Tex3 = Tex + float2(+1.0f/MAP_WIDTH, +1.0f/MAP_HEIGHT); return Out; } // ------------------------------------------------------------ // Å×Å©´Ð // ------------------------------------------------------------ technique TShader4 { pass P0// 16¹Ú½ºÇÊÅÍ »ùÇøµ { // ¼ÎÀÌ´õ VertexShader = compile vs_1_1 VS4(); PixelShader = ; // »ùÇ÷¯ Sampler[0] = (SrcSamp); Sampler[1] = (SrcSamp); Sampler[2] = (SrcSamp); Sampler[3] = (SrcSamp); } pass P1// 9ÄÜÇÊÅÍ »ùÇøµ { // ¼ÎÀÌ´õ VertexShader = compile vs_1_1 VS9(); PixelShader = ; // »ùÇ÷¯ Sampler[0] = (SrcSamp); Sampler[1] = (SrcSamp); Sampler[2] = (SrcSamp); Sampler[3] = (SrcSamp); } } // ------------------------------------------------------------- // Å×Å©´Ð // ------------------------------------------------------------- technique TShader { pass P0 { // ¼ÎÀÌ´õ VertexShader = compile vs_1_1 VS_pass1(); PixelShader = compile ps_2_0 PS_pass1(); } pass P1 { // ¼ÎÀÌ´õ VertexShader = compile vs_1_1 VS_pass2(); PixelShader = compile ps_2_0 PS_pass2(); } } technique TShader16 { pass P0 { // ¼ÎÀÌ´õ VertexShader = compile vs_1_1 VS(); PixelShader = compile ps_2_0 PS(); } }