RGSS2を知る(12)

グレースケール化の処理について。
osakana.factoryさま
http://ofo.jp/osakana/cgtips/grayscale.phtml
このサイトさまを参考に、Spriteのグレースケール化した色と、自前計算した色が一致するような計算式を探った。

b = Bitmap.new(200,200)
b.fill_rect(b.rect, Color.new(255,255,100))

s = Sprite.new
s.bitmap = b

v = Viewport.new(200,0,200,200)
v.color = Color.new(255,255,100)

g = 0

loop do
  g += 1
  g = 255 if g > 255
  s.tone.gray = g
  vr = 255 + (((255*0.298912+255*0.586611 +100*0.114478 )-255) * g / 255)
  vg = 255 + (((255*0.298912+255*0.586611 +100*0.114478 )-255) * g / 255)
  vb = 100 + (((255*0.298912+255*0.586611 +100*0.114478 )-100) * g / 255)
  v.color = Color.new(vr, vg, vb)
  Graphics.update
end

なんというか無理矢理なコードだが、上記サイトさまによるとNTSC係数による加重平均法という式を突っ込むとRGSSの処理と完全に一致するように見える。
Y = ( 0.298912 * R + 0.586611 * G + 0.114478 * B )
簡略化した計算にすると微妙に色がズレるから、たぶんこの式で合っているはず。


ところでSpriteのtone、colorは初期値がnilだとばっかり思っていたが、それぞれ(0,0,0,0)のToneオブジェクトとColorオブジェクトが入っていた。