syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

Direct2D Effectsで発光する雷をプロシージャル生成する

Windows 8で使えるようになったDirect2D 1.1には、多数の便利な機能が追加されています。ブレンドモード(Composite Mode)の制御のほか、シェーダーを利用したエフェクトが使えるようになりました。
エフェクトは頂点シェーダーで実装されているとおぼしきアフィン変換や、ピクセルシェーダーで実装されているとおぼしきカラー変換、ドロップシャドウ、ブラーなどの便利なプリセットがあらかじめいくつか用意されているほか、ユーザープログラマーがHLSLで書いたカスタムシェーダーをもとにエフェクトを作成することもできるようです。役割的にはWPFのエフェクトに近いかもしれません。

Effects (Direct2D Programming Guide)

Windows Vista SP1 PU以降のOSに提供されている初代Direct2D 1.0では、ブレンドモードの制御ができなかったりして結局ちょっと複雑な画面効果となるともうお手上げでDirect3D連携するしかなかったのですが、Direct2D 1.1だとパラメータの設定だけで簡単に制御できるようになっています。もちろん加算合成もできるようになっているので、乱数を使ってプロシージャル生成したライトニング(稲光、稲妻、雷光、電光)に対してブルームエフェクト(グローエフェクト)を適用するテストをしてみました。

https://sygh-jp.github.io/content_hosting/my_program_ss/MfcD2DEffectTest1_ss_2014_08_07a.png

サンプルコード:MfcD2DEffectTest1.zip

コーディングと動作検証は

で行なっていますが、Windows 7でもSP1 Platform UpdateであればDirect3D 11.1/Direct2D 1.1が一応使えるので動作すると思います。今回もMFCを使いましたが、Visual Studio 2010で追加されたDirect2D 1.0ラッパーは使わず、Direct2D 1.1 APIを直接叩いています。

雷光のライン生成アルゴリズムに関してはまだ改良の余地ありで、3次元に拡張する作業も残っているのですが、それっぽい見た目にはなっているんじゃないでしょうか。
最初は同じことをWPFのIM (Immediate Mode) でやってみようと思っていたんですが、エフェクトはともかくブレンドに関してはむしろDirect2D/Direct3Dで書いたほうがてっとり早いと気付いてしまったのでやめました。

ちなみにDirect3D 10/11を直に叩いた経験がある人だったら、Direct2Dのエフェクトが裏で何をやっているかだいたい想像がつくと思います。
Direct2Dを使ったコードがうまく動作しないという場合も、Direct3Dの経験があれば問題点を比較的簡単に特定できるでしょう。