波うちシェーダ

以前、ラスタスクロールのシェーダを作ったが、それの変形。
ラスタスクロールはy座標をsin関数に突っ込んでx座標を変えていて、今回は中心からの距離をsinに突っ込んでy座標を変えている。中心点から同心円状に縦に歪む。
この例だとけっこうキツいので、もっと振幅を減らしてマイルドにしたほうが使いやすいかもしれない。


画像はきまぐれアフター様
http://gakaiblog.at.webry.info/

require 'dxruby'

hlsl = <<EOS
float g_start;
float g_level;
texture tex0;
sampler Samp = sampler_state
{
 Texture =<tex0>;
 AddressU = BORDER;
 AddressV = BORDER;
};

float4 PS(float2 input : TEXCOORD0) : COLOR0
{
  float4 output;
  input.y = input.y + sin(radians(distance(input, float2(0.5,0.5))*360*3-g_start))*g_level;
  output = tex2D( Samp, input );

  return output;
}

technique Raster
{
 pass P0
 {
  PixelShader = compile ps_2_0 PS();
 }
}
EOS

Window.width, Window.height = 800, 600
core = DXRuby::Shader::Core.new(hlsl, {:g_start=>:float, :g_level=>:float})
shader = Shader.new(core, "Raster")
shader.g_start = 0
shader.g_level = 0
image = Image.load("bgimage/BG42a.jpg")

Window.loop do
  shader.g_start += 2
  shader.g_level = 0.1
  Window.draw_shader(0, 0, image, shader)
  break if Input.key_push?(K_ESCAPE)
end

追記。ちなみにマイルドにするとこんな感じになる。

動いてないとよくわかんないね。