ブラー
Maverick Projectさまを参考に。
http://maverickproj.web.fc2.com/pg30.html
DXRuby1.3devで動作するよう修正してみた。いろいろいじったけど、変数名とか元のままで動くのでそのままコピペすればよかった。
passを自由に指定できるようにしたほうがよいか、しかしそうなると複数Techniqueと複数passをどう使い分ければいいのかわからない。
require 'dxruby' hlsl = <<EOS texture tex0; float2 g_size; sampler Samp0 = sampler_state { Texture =<tex0>; AddressU=BORDER; AddressV=BORDER; }; float4 PS1(float2 In : TEXCOORD0) : COLOR0 { float2 Texel0 = In + float2( -1.0/g_size.x, 0.0f ); float2 Texel1 = In + float2( -1.0/g_size.x*2, 0.0f ); float2 Texel2 = In + float2( -1.0/g_size.x*3, 0.0f ); float2 Texel3 = In + float2( -1.0/g_size.x*4, 0.0f ); float2 Texel4 = In + float2( -1.0/g_size.x*5, 0.0f ); float2 Texel5 = In + float2( 1.0/g_size.x, 0.0f ); float2 Texel6 = In + float2( 1.0/g_size.x*2, 0.0f ); float2 Texel7 = In + float2( 1.0/g_size.x*3, 0.0f ); float2 Texel8 = In + float2( 1.0/g_size.x*4, 0.0f ); float2 Texel9 = In + float2( 1.0/g_size.x*5, 0.0f ); float4 p0 = tex2D( Samp0, In ) * 0.20f; float4 p1 = tex2D( Samp0, Texel0 ) * 0.12f; float4 p2 = tex2D( Samp0, Texel1 ) * 0.10f; float4 p3 = tex2D( Samp0, Texel2 ) * 0.08f; float4 p4 = tex2D( Samp0, Texel3 ) * 0.06f; float4 p5 = tex2D( Samp0, Texel4 ) * 0.04f; float4 p6 = tex2D( Samp0, Texel5 ) * 0.12f; float4 p7 = tex2D( Samp0, Texel6 ) * 0.10f; float4 p8 = tex2D( Samp0, Texel7 ) * 0.08f; float4 p9 = tex2D( Samp0, Texel8 ) * 0.06f; float4 p10 = tex2D( Samp0, Texel9 ) * 0.04f; return p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; } float4 PS2(float2 In : TEXCOORD0) : COLOR0 { float2 Texel0 = In + float2( 0.0f, -1.0/g_size.y ); float2 Texel1 = In + float2( 0.0f, -1.0/g_size.y*2 ); float2 Texel2 = In + float2( 0.0f, -1.0/g_size.y*3 ); float2 Texel3 = In + float2( 0.0f, -1.0/g_size.y*4 ); float2 Texel4 = In + float2( 0.0f, -1.0/g_size.y*5 ); float2 Texel5 = In + float2( 0.0f, 1.0/g_size.y ); float2 Texel6 = In + float2( 0.0f, 1.0/g_size.y*2 ); float2 Texel7 = In + float2( 0.0f, 1.0/g_size.y*3 ); float2 Texel8 = In + float2( 0.0f, 1.0/g_size.y*4 ); float2 Texel9 = In + float2( 0.0f, 1.0/g_size.y*5 ); float4 p0 = tex2D( Samp0, In ) * 0.20f; float4 p1 = tex2D( Samp0, Texel0 ) * 0.12f; float4 p2 = tex2D( Samp0, Texel1 ) * 0.10f; float4 p3 = tex2D( Samp0, Texel2 ) * 0.08f; float4 p4 = tex2D( Samp0, Texel3 ) * 0.06f; float4 p5 = tex2D( Samp0, Texel4 ) * 0.04f; float4 p6 = tex2D( Samp0, Texel5 ) * 0.12f; float4 p7 = tex2D( Samp0, Texel6 ) * 0.10f; float4 p8 = tex2D( Samp0, Texel7 ) * 0.08f; float4 p9 = tex2D( Samp0, Texel8 ) * 0.06f; float4 p10 = tex2D( Samp0, Texel9 ) * 0.04f; return p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; } technique Blur1 { pass P0 { PixelShader = compile ps_2_0 PS1(); } } technique Blur2 { pass P0 { PixelShader = compile ps_2_0 PS2(); } } EOS core = Shader::Core.new(hlsl,{:g_size => :float}) shader1 = Shader.new(core, "Blur1") shader2 = Shader.new(core, "Blur2") image = Image.load("./image/maptile2.png") shader1.g_size = [image.width,image.height] shader2.g_size = [image.width,image.height] rt1 = RenderTarget.new(image.width,image.height) rt2 = RenderTarget.new(image.width,image.height) Window.loop do Window.draw(50, 50, image) rt1.draw_shader(0, 0, image, shader1) rt1.update rt2.draw_shader(0, 0, rt1, shader2) rt2.update Window.draw(350, 50, rt2) end