テクスチャの合成

DXRubyではなんとなく半透明と加算合成に対応している。
DirectXはテクスチャを描画する際に、描画しようとするテクスチャと、描画先にある絵をどのように合成するかを指定する、レンダーステートが存在する。
簡単に言えば、D3DBLEND_SRCALPHAとすれば指定したα値で透明になっていくし、D3DBLEND_INVSRCALPHAとすれば指定したα値で不透明になっていく。
D3DBLEND_ONEは透明化しない。D3DBLEND_ZEROは真っ黒だ。
これを描画する絵と先の絵にどのように指定するかで、半透明とか加算合成とかが決まる。


描画する絵をSRCALPHA、先の絵をINVSRCALPHAとすれば半透明だ。
両方をONEにしたら単純加算合成で、描画する絵をSRCALPHAにすれば半透明加算になる。
α値をMAXにした半透明加算は単純加算合成と同じだ。
んで、描画する絵をZEROにして先の絵をINVSRCALPHAとすれば減算合成になるわけだ。
減算合成の場合、描画する絵には色さえ置いておけばその部分が黒くなるから、完全に透明か、そうでないか、という感じで範囲を決める。
でもこの理屈をよく考えてみると、半透明合成の描画する絵を、透明の部分と、不透明の黒い部分で作れば、減算合成と全く同じ結果が得られることがわかる。
つまり減算合成というのは、黒い絵との半透明合成なのだ。


とはいえ、どういうわけか世の中、減算合成をわざわざサポートしているライブラリが多い。
何かしら違いがあるのだろうか。
絵の作り方が違うから、そのあたりが要因かもしれない。
サポートしません、って言うと、「えー」って言われそうだから、簡単にできるし、とりあえずサポートする方向で考えておこう。