RGSS2を知る(26)
色の合成にリベンジ。
少し色のパターンを変えてみた。
b1 = Bitmap.new(100,100) b1.fill_rect(b1.rect, Color.new(50,150,255,100)) b2 = Bitmap.new(100,100) b2.fill_rect(b2.rect, Color.new(255,150,50,200)) b = Bitmap.new(640,480) b.blt(0, 0, b1, b1.rect) b.blt(0, 0, b2, b2.rect) p b.get_pixel(50,50) # => (234,150,70,221) s = Sprite.new s.bitmap = b loop do Graphics.update end
(234,150,70,221)となった。
組み上げてみた計算式は以下で、これと一致するか検証する。
ややこしいから色を全部0〜1.0と置く。
α = (1.0 - As) * Ad + As
下の絵は上の絵のα(As)によって影響が削られるから、1.0から引いたぶんが下の絵の影響量(1.0-As)となり、その影響量のぶんまで下の絵のα(Ad)を減らし、上の絵のαを足す。
Red = (As * Rs) / α + (Ad * Rd) * (1.0 - As) / α
上の絵の色の量はAs×Rsだが、αがAsと違うから、そのぶんを補正する。下の絵の色はAd×Rdで、上の絵の影響で削られるぶんをさっぴいて、αの補正を入れる。
GreenとBlueは同じ式である。
as = 200.0/255.0 ad = 100.0/255.0 rs = 255.0 / 255.0 rd = 50.0 / 255.0 gs = 150.0 / 255.0 gd = 150.0 / 255.0 bs = 50.0 / 255.0 bd = 255.0 / 255.0 ta = ((1.0 - as) * ad + as) p ta * 255 # => 221.56862745098 p ((as * rs) / ta + (ad * rd) * (1.0 - as) / ta) * 255.0 # => 235.044247787611 p ((as * gs) / ta + (ad * gd) * (1.0 - as) / ta) * 255.0 # => 150.0 p ((as * bs) / ta + (ad * bd) * (1.0 - as) / ta) * 255.0 # => 69.9557522123894
惜しい。