趣味プログラマによるOSS開発日誌

趣味で作っているOSSソフトウェアの紹介や関連技術の紹介、楽曲製作、Webデザイン勉強状況を紹介します。

時間が止まったようなエフェクト

テレビ番組やアニメ、ゲームで見かける時間が止まったようなエフェクトを、DirectXのアルファブレンドを使って実現する方法を紹介する。

このエフェクトを実現するための、アルファブレンドの計算式は以下のようになる。
aはアルファ値、srcは転送元、dstは転送先である。

結果 = dst * RGBA(a,a,a,a) - src * RGBA(a,a,a,a)

これをDirectXで実現した場合、コードは以下のようになる。
pDevはIDirect3DDevice9のポインタ型である。

pDev->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_REVSUBTRACT );   // 転送元 - 転送先
pDev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );       // 転送元のα値を考慮
pDev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_DESTALPHA );     // 転送元のα値を考慮