影をつけてみた

昨日のやつにすごく適当にライティング計算を追加してみた。適当すぎるので正しいかどうかはわからないがなんとなくそれっぽく見えてはいるようだ。

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;
  float distance = radians(distance(input, float2(0.5, 0.5)) * 360 * 4 - g_start);
  float height = sin(distance);
  float slope = cos(distance);
  float d = clamp(-1,1,dot(normalize(float3(input.y - 0.5, input.x - 0.5,0 )), float3(0.5,-0.5,0.5)))*slope+1;
  input.y = input.y + height * g_level;

  output = tex2D( Samp, input ) * d;

  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 += 3
  shader.g_level = 0.15
  Window.draw_shader(0, 0, image, shader)
  break if Input.key_push?(K_ESCAPE)
end