2014年10月20日

RGBとアルファ値で別々の合成式を使う

漠然と不思議に思っていたんです。Diretxでアルファ合成したときに、合成後のアルファ値はどうなっているのだろうかと。
普通に考えれば不透明のターゲットに対して半透明の画像をアルファ合成したとき、合成後のアルファ値は不透明なままになるのが自然なのですが、アルファ合成の式を

device->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);

と設定しているのにアルファ値だけ計算方法が異なるというのもおかしな話です。となると、アルファ値も上記の式に従っているはずなのですが…。
しかし合成後のアルファ値というのは使う機会がなく、別にどんな値でも最終的に描画される画像にも影響しないために特に追求することなく放置していました。

ところが合成語のアルファ値を使う機会が出てきてしまったのです。そう、レンダーターゲットへの描画です。
不透明画像があるレンダーターゲットに対して半透明画像をアルファ合成してから、そのレンダーターゲットを描画すると、半透明画像の部分だけアルファ値がおかしくなります。

アルファ部分だけ別の合成式にする設定さえあれば…と考えたところでふと思い出したのですが、そういえば以前 OpenGL のマニュアルで Separate blend ナントカって関数を見たなと。
それをみた当時はさっぱり意味が分からず、glBlendFunc 以外にも合成関数があったのかぐらいに思っていたのですが、考えてみたら名前がすごくそれっぽいです。
そこで OpenGL オンラインマニュアルの glBlendFunc を開き、関連項目を見てみると、glBlendFuncSeparate というのがありました。まさに今、欲している機能です。

http://www.opengl.org/sdk/docs/man2/xhtml/glBlendFuncSeparate.xml

というわけで、この glBlendFuncSeparate 相当の機能を Direct3D9 で探してみようと google 先生に聞いてみたところ、D3DRS_SEPARATEALPHABLENDENABLE という単語が引っかかりました。
で、最終的に以下のページに行きつき、目的の関数と設定を得ることができました

http://msdn.microsoft.com/ja-jp/library/bb147328(v=vs.85).aspx
http://marupeke296.com/cgi-bin/cbbs/cbbs.cgi?mode=al2&namber=1423&rev=&no=0&P=R&KLOG=2

これでRGBとAで異なる合成関数を適用してみたところ、見事にアルファがらみの問題がなくなりました。
めでたし、めでたしです。

しかしまさか OpenGL のマニュアルに助けられるとは。あれを思い出さなかったら、調べるのにもっと時間がかかったかもしれません。

posted by JUNOSOFT at 08:59| Comment(0) | プログラミング
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。