Direct3Dで減算合成
![]()
![]()
![]()
・更新
今、引越しとFF8を片づけるためにこのホームページを更新する余裕がありません。なので、3月20日を過ぎるまではこれ以降更新が無いと思ってくださって構いません。今回も最小限の画像しか作ってません。
今回は説明も少なく済む上待望している方もいるかもしれないDirect3Dで減算合成を使う方法を解説します。OpenGLでも多分できると思いますけど。元々はうちの掲示板でTAOSさんとたていすさんが「Direct3Dでも減算が使えれば」と嘆いていた(?)時に考えてみたものです。
Direct3Dでは加算や半透明などいろいろなα合成ができます。が、PlayStationにできてDirect3Dにできないα合成が一つだけあります。それが減算合成です。加算合成は色の足し算ですが、減算合成は逆に色の引き算をします。
Dest
Src
加算合成
減算合成減算合成って、黒の半透明(乗算合成)と違って不思議な雰囲気がありますよね。α合成を使わない半透明の時みたいにトーンカーブで見ればわかりやすいんですけど、黒の半透明だと色の彩度が段々失われていくのに対し、減算合成だと彩度がある程度までは残ります。加算合成を白の半透明と比較した時と同じように。白の半透明だと彩度は落ちていきますが、加算合成ならある程度まで彩度は残ります。
・やり方
黒の半透明と減算合成の違いは、白の半透明と加算合成とほとんど同じです。加算合成での色をそのままひっくり返すと(色を反転すると)減算合成に見えます。
Dest
Destの反転
Src
加算合成→反転
減算合成→反転さて、「ブレンドファクター121」をしっかり読んでいれば、ここでやり方を思い付く方もいるでしょう。
反転して加算合成すると減算合成と同じになります。ならば、加算合成で減算合成の代用ができるということです。反転して加算合成して反転すると減算合成の出来上がり。
Dest
反転
加算合成
反転ほらとっても簡単。「実際にこうすると、反転に時間がかかる」という意見もあるかもしれませんが、反転はα合成でできますよね。Src:D3DBLEND_INVDESTCOLOR Dest:D3DBLEND_ZEROでした。詳しくは「ブレンドファクター121」参照。
実際にやってみる場合の手順としては、Srcを真っ白にしてSrc:INVDESTCOLOR Dest:ZEROで反転、Srcを減算したい色・テクスチャにしてSrc:ONEやSRCALPHA Dest:ONEで加算、Srcを真っ白にしてSrc:INVDESTCOLOR Dest:ZEROで反転。3回描画する必要がありますね。2回に縮めたいところですけど、反転の時にSrcを白にする必要があるので難しいです。反転するときにSrcの色を真っ白にする必要があるので、テクスチャ毎にソートして描画する仕組みにしてるとやっかいですね。
Dest
反転(四角の
ポリゴンを描画)
加算合成
反転減算合成が複数回あるなら、先に広範囲を反転してしまうという方法もあります。(反転→加算→反転)×描画数という手順を、反転1回→加算×描画数→反転1回で済ませる事ができます。物体を減算合成で描画する時などはこっちの方が断然良いです。
あぁ、なんだかブレンドファクター職人みたいになっている……。次回はテクスチャ座標の扱いがDirectX5からDirectX6になって変わった話か、映り込み第3弾についてします。どちらも短く済むはず。後者はすっかり忘れてたんですけど、gridmanさんの所で遠隔的に感謝されて思い出しました。
![]()
![]()
![]()
written by Y.Ohde e-mail : oode@alles.or.jp