レイヤー合成

フォトショ等のDraw系ソフトでお馴染みのレイヤー。α値を用いることにより半透明が可能でいろいろと便利な代物。しかし実際の計算はどうやっているのか?簡単の為に普通の乗算合成だけに話を絞る。

まずは2枚のレイヤーを考える。ある座標のピクセルに注目して、下の絵の色の値をC0とし、上の絵の色がC1、α値がα1とすると、実際に出てくる色Cは、
 C = C_0 ( 1 - \alpha_1 ) + C_1 \alpha_1
となる。ちなみに色もαも0〜1をとるものとする。見てわかるとおり、普通に内分点を取っているだけであり、極簡単な式で表される。他の加算合成や減算合成等も簡単な式で表されるがここでは割愛する。
それではレイヤーが3枚ある場合はどうなるか?その場合はまず下の2枚を計算し、それを新たな1枚のレイヤーとみなして再び計算すればよい。具体的に書くと
 C = \{ C_0 ( 1 - \alpha_1 ) + C_1 \alpha_1 \} ( 1 - \alpha_2 ) + C_2 \alpha_ 2
となる。
ここまで出てきた2枚もしくは3枚のレイヤーの合成は実は対等ではない。下のレイヤーはα値がないのに対して上のレイヤーだけα値がある。つまりα付きレイヤーとαなしレイヤーとの合成だ。それでは他の組み合わせは? αナシレイヤー同士の合成はどうせ全部上のレイヤーの色になるから論外としてα付きレイヤー同士の合成はどうなるのだろうか?これはちょっと難しい。
先ほどの3枚レイヤーの合成を例に取ると、まずは下2枚を合成してから新しくできたレイヤーと更に上のレイヤーを合成している。この順番を変えるわけである。上2枚のレイヤーを先に合成するわけで、それで新しく出来たレイヤーを下のレイヤーと合成するわけだが、合成するにはどちらか1つは必ずα付きにならないとヘンなことが起こるので、α付き同士の合成はα付きレイヤーになることが推測できる。また、レイヤーの合成の順番を変えても最終的に同じ色になってないといけない。この情報を元に合成の式を考えてみる。上二枚を合成した結果の色の値をC12、αの値をα12とすると、最終的な色は以下の式になるはずである。
 C = C_0 ( 1 - \alpha_{12} ) + C_{12} \alpha_{12}
これが最初に計算した値と同じになっている必要があるので次の恒等式が成り立つ必要がある。
 \{ C_0 ( 1 - \alpha_1 ) + C_1 \alpha_1 \} ( 1 - \alpha_2 ) + C_2 \alpha_2 = C_0 ( 1 - \alpha_{12} ) + C_{12} \alpha_{12}
この式を解いてα12とC12をC1、C2、α1、α2で表せばよい。計算を打ち込むのめどいので結果だけ記すと
 \alpha_{12} = \alpha_1 + \alpha_2 - \alpha_1 \alpha_2
 C_{12} = \frac{C_1 \alpha_1(1-\alpha_2) + C_2 \alpha_2 }{ \alpha_1 + \alpha_2 - \alpha_1 \alpha_2 }
となる。検算すればわかるが、ちゃんと0≦α12≦1や0≦C12≦1を満たしていてこの変形は有効であることがわかる。ちなみにα1=α2=0のとき、C12は不定になってしまう(発散はしない)が、これはそもそもαが0になるので色を持つ意味がないのでこれも問題はない。




というわけでαテクスチャのピクセル弄ってて躓いたところでした(ぉ