Shaderクラス

まだちょっと作ってみた状態だから出せないけど。

require 'dxruby'

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

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.r = output.Color.r + ((ntscy - output.Color.r) * g_tone.a);
  temp.g = output.Color.g + ((ntscy - output.Color.g) * g_tone.a);
  temp.b = output.Color.b + ((ntscy - output.Color.b) * 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_blend", Vector.new([0,0,0,0]))
shader.setValue("g_tone", Vector.new([0,0,0,0]))

a = 0
image  =Image.new(100,100,[255,100,0])
Window.loop do
  a += 0.01 if a < 1.0
  shader.setValue("g_tone", Vector.new([0,0,0,a]))
  Window.drawShader(0, 0, image, shader)
end

FreeRGSSのflash、color、toneを実現するのに作ったHLSLのコード。
を、DXRuby1.1で追加予定のShaderクラスに突っ込んで描画したところ。
実行すると、黄色っぽい赤からグレーに変化していく。
シェーダは汎用の仕組みだから、RGSSみたいに使おうと思ったらラッパ作らないといけない。
このへんができたらDXRuby上でRGSSが本格的に動かせるかもしれないが、Rubyで書いたら遅くて悲しいことになるから、Cで書かないといけない。
FreeRGSSからコードを取ってきてDXRubyインターフェイスを使う拡張ライブラリを作ればRGSSonDXRubyもできないことはないのだろうな。
そんなんできたら3DやシェーダができるRGSSとなるわけだ。
誰かそういうもの作りませんかどうですか。