PowerDOFの絶対壁エフェクト対応の記録

はじめに

 私がMMDで動画を作るときによく使うエフェクトがExcellentShadowとPowerDOFです。先日、ExcellentShadowを絶対壁エフェクトに対応させる改変をしたので次はPowerDOFをやろうと思います。

 DOFエフェクトっていくつかあるので色々試すんだけど結局、針金さんのPowerDOFに落ち着くっていう・・・ikenoさんのikBokehもいいんだけど重いのがね・・・

作業開始

 ExcellentShadowを改変した時に散々悩んでいるので今回はスムーズにいくといいのですが・・・ExcellentShadowを改変した時と同様に絶対壁エフェクトから必要な部分をコピーしてきてPowerDOFの適当な場所に貼り付けていきます。

絶対壁エフェクト(AbsoluteWall_ver2.fx)のコピー箇所

 コピー箇所は AbsoluteWall_ver2.fx  の13行目~46行目と124行目~243行目(両方合わせて①とします)と、頂点シェーダに絶対壁変形の結果を渡す記述で例えば252,253行目(②とします)です。尚、②は下記のようにしています。3行目は冗長な感じですが・・・

    ABSOLUTE_RET ret = (ABSOLUTE_RET)0;    // 追加
    ret = AbsoluteWall(Pos,Normal);        // 追加
    Pos = ret;                             // 追加

もし頂点シェーダの引数に
 float3 Normal : NORMAL
が無かったらこれも引数に追加します。

PowerDOFの改変箇所

 改変するPowerDOFのバージョンは0.0.5で、対象ファイルは
 ・PowerDOF.fx  →コピーして PowerDOF_AW2.fx にリネーム
 ・PDOF_Depth.fxsub  →コピーして PDOF_Depth_AW2.fxsub にリネーム
の2ファイルです。PowerDOF.x もコピーして PowerDOF_AW2.x とリネームだけしておきます。MMMは使用予定が無いので "PDOF_DepthMMM.fxsub" はスルーします。
 まず PowerDOF_AW2.fx  から。"共通の頂点シェーダ"というコメントが321行目と779行目にあるので①を321行目の直前に張り付けます。
 次に2つある"共通の頂点シェーダ"を下記の様に②を張り付けます。引数も無かったので追加してます。

VS_OUTPUT VS_Common( float4 Pos : POSITION, float3 Normal : NORMAL, float2 Tex : TEXCOORD0 )
{                                        // ↑ 追加
    VS_OUTPUT Out = (VS_OUTPUT)0; 

    ABSOLUTE_RET ret = (ABSOLUTE_RET)0;    // 追加
    ret = AbsoluteWall(Pos,Normal);        // 追加
    Pos = ret;                             // 追加

    Out.Pos = Pos;
    Out.Tex = Tex + ViewportOffset;

    return Out;
}
VS_OUTPUT VS_FocusDepth(float4 Pos : POSITION, float3 Normal : NORMAL, float2 Tex: TEXCOORD)
{                                           // ↑ 追加
    VS_OUTPUT Out = (VS_OUTPUT)0; 

    ABSOLUTE_RET ret = (ABSOLUTE_RET)0;    // 追加
    ret = AbsoluteWall(Pos,Normal);        // 追加
    Pos = ret;                             // 追加

    Out.Pos = Pos;
    Out.Tex = Tex + float2(0.5f, 0.5f);

    return Out;
}

 つづいて"PDOF_Depth_AW2.fxsub"の改変です。46行目に頂点シェーダがあるのでその直前に①を張り付け、②を下記の様に貼り付けます。

VS_OUTPUT VS_Object(float4 Pos : POSITION, float3 Normal : NORMAL, float2 Tex : TEXCOORD0)
{                                        //↑ 追加
    VS_OUTPUT Out = (VS_OUTPUT)0; 

    ABSOLUTE_RET ret = (ABSOLUTE_RET)0;    // 追加
    ret = AbsoluteWall(Pos,Normal);        // 追加
    Pos = ret;                             // 追加

    // カメラ視点のワールドビュー射影変換
    Out.Pos = mul( Pos, WorldViewProjMatrix );

    // カメラ視点のワールドビュー変換
    Out.VPos = mul( Pos, WorldViewMatrix );

    // テクスチャ座標
    Out.Tex = Tex;

    return Out;
}

MMDで確認

 ここでちょっとMMDで確認してみます。忘れてましたが絶対壁エフェクトで使用する下記3ファイルをPowerDOFのフォルダにコピーしておきます。
 ・AbsoluteWall.pmx
 ・AbsoluteWall_ver2.fx
 ・bump_tex.png
DOFの効果が分かりやすいようMMDにステージとキャラモデル(MEIKOさん)を読み込みます。次に AbsoluteWall.pmx を読み込んでからMMEでMEIKOさんに AbsoluteWall_ver2.fx を割り当てます。更に PowerDOF_AW2.x を読み込んだ所でエラーが・・・

図1. 絶対壁は効いてるけど・・・
図2. 案の定のエラー

エラーメッセージの最後の行
 ~ \PowerDOF_v005\PowerDOF_AW2.fx(489,9): error X3017: cannot convert from 'struct ABSOLUTE_RET' to 'float4'
が特に怪しい気がします。
 Pos = ret;
を追加したのがまずかった気がするので
 Pos = ret.Pos4;
としました。(2箇所とも)すると・・・

図3. エラー増えた?

ExcellentShadowを改変した時にもあった頂点シェーダのバージョンがうんたらかんたら、があるので vs_2_0 と ps_2_0 を vs_3_0 と ps_3_0 に書き換えます。そしたらエラーは消えました。

図4. DOFの位置がずれてる・・・なんでや!

 そういえば PDOF_Depth_AW2.fxsub も改変してるのにエラーが出てない・・・のでMMEのPDOF_DepthRTタブを確認するとPDOF_Depth.fxsub が割り当てられていました。PowerDOF_AW2.fx  で PDOF_Depth.fxsub を検索して PDOF_Depth_AW2.fxsub と書き換えます。多分この部分は PowerDOF.x をMMDで読み込むと自動的に PDOF_Depth.fxsub を割り当てるように指示してるんだと思います。一旦MMDから PowerDOF_AW2.x を削除してから再度、読込直すと無事 PDOF_Depth_AW2.fxsub が割り当てられてエラーも出ました。(ここの文章、読み返してみるとややこしくて申し訳ないです)

図4. エフェクト改変はエラーが出てなんぼだね

PDOF_Depth_AW2.fxsub も上でやったような修正をします。
 ・Pos = ret; → Pos = ret.Pos4;
 ・vs_2_0 と ps_2_0 → vs_3_0 と ps_3_0

図5. 上手くいったっぽい!

 PowerDOFはMEIKOさんの頭に取り付けています。一応改変成功のようです。なぜか今回の改変では絶対壁エフェクトの色替えモーフも機能しています。あとはMMMにも対応出来ればいいのですがまぁ・・・いいか。

図6. ExcellentShadow,ExShadowSSAO,PowerDOFと絶対壁が使えるようになった


この記事が気に入ったらサポートをしてみませんか?