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となるわけだ。
誰かそういうもの作りませんかどうですか。