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

惜しい。