RGSS2を知る(9)

ボケていた。
ちょっと前にためしたflashメソッドの実験で、Viewportのflashは範囲全体のflashだった。
Sprite描画のflashを上書きするように、範囲が単色で塗りつぶされる。
ということは、処理的にはSpriteを描画したあとで、Viewportのサイズの矩形をアルファブレンド描画しているわけだ。
Spriteが元画像のα値を残すのに対して、Viewportはそれを無視して描画するのは、Spriteは元絵を補正するのに対し、Viewportは元絵無し(バックバッファを元絵と考えると元絵はα値を持たない)であるから、と考えればそこそこ自然だ。
そういうことであればViewportがサーフェイスである必要性も利点も無いので、そうなっていないことも納得できる。


問題になるのはtoneプロパティだ。

v1 = Viewport.new(0,0,400,300)
v1.tone = Tone.new(128,0,0)
v2 = Viewport.new(100,100,400,300)
v2.tone = Tone.new(128,0,0)
v3 = Viewport.new(200,0,400,300)
v3.tone = Tone.new(0,0,0,128)
v4 = Viewport.new(0,200,400,300)
v4.tone = Tone.new(0,0,0,128)

loop do
  Graphics.update
end


実験するまでもなく結果は見えてるのだが、Viewportのtoneプロパティによる色調補正は指定範囲全体に及ぶから、矩形で加算合成・減算合成を正確にできるのならやればよい。
DirectXのレンダーステートでは正確な減算合成は無いから、これもソフトウェア処理かピクセルシェーダでやることになる。
んでもってグレースケール化も同様だ。
これらの処理はバックバッファから値を取ってくる必要があって、ソフトウェア処理なら何も問題なくできるが、ピクセルシェーダを使う場合は・・・テクスチャとレンダーターゲットを同じにすることはできないってマイクロソフトも言ってたし、どうすればいいのかよくわからない。
DXRubyでできるかどうか以前に、3Dレンダリングでできるのかどうかという問題だ。
もちろん、レンダーターゲットとなるサーフェイスを新たに作ってそっちにコピーしてからグレースケール化するピクセルシェーダで描き戻すとかすれば可能だろうが、いまいちスマートでない。