DXRuby1.1.10dev

http://dxruby.sourceforge.jp/cgi-bin/hiki.cgi?%A5%D5%A5%A1%A5%A4%A5%EB%C3%D6%A4%AD%BE%EC
disposeメソッドの実装、DXRUBY_RENDERTARGET定数の廃止、Shaderのパラメータを切り替えながら複数描画、フルスクリーン切り替え関連の不具合修正。
一つのShaderでパラメータを切り替えて描画できるから、こんな感じのことがShaderオブジェクト一つでできる。

そんな当たり前のことが今までできなかったわけだが、その当たり前のものを実装するには意外に手間がかかる。
世の中、プログラミングに関してはどんどん進歩していき、環境側、言語、ライブラリなどもよくなっていくが、そういうサポートが無い領域の「当たり前」は基本的には開発者の努力に依存する。
当たり前のことを当たり前にできるようにするには、細かいところまで考えた地道な改良が必要だ。
それはたぶんゲームの開発なんかにも通じるものがあるんじゃないかと思う。

require 'dxruby'

hlsl = <<EOS
float4 g_blend;
float4 g_tone;
texture Tex0;
sampler Samp = sampler_state
{
 Texture =<Tex0>;
};

struct PixelIn
{
  float2 UV : TEXCOORD0;
};
struct PixelOut
{
  float4 Color : COLOR0;
};

PixelOut PS(PixelIn input)
{
  PixelOut output;
  float3 temp;
  float3 ntsc = {0.298912, 0.586611, 0.114478};
  float ntscy;
  output.Color = tex2D( Samp, input.UV );

  ntsc = ntsc * output.Color.rgb;
  ntscy = ntsc.r + ntsc.g + ntsc.b;
  temp.rgb = output.Color.rgb + ((ntscy - output.Color.rgb) * g_tone.a);

  output.Color.rgb = min(1, temp + g_tone.rgb) * (1.0 - g_blend.a) + g_blend.rgb * g_blend.a;

  return output;
}

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

shader = Shader.new(hlsl, "TShader")
shader.setValue("g_tone", Vector.new(0,0,0,0))

image  =Image.new(100,100,[0,255,0])
Window.loop do
  for i in 0..5
    shader.setValue("g_tone", Vector.new(0,0,0,0.2 * i))
    Window.drawShader(i*100, 0, image, shader)
  end
end