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 を読み込んだ所でエラーが・・・


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

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

そういえば 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 が割り当てられてエラーも出ました。(ここの文章、読み返してみるとややこしくて申し訳ないです)

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

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