ExcellentShadowを絶対壁に対応させる改変の記録2
前回に引き続き絶対壁とExcellentShadowの改変です。
ExcellentShadow付属のExShadowSSAOも絶対壁対応を目論見ます。
前回ExcellentShadowに絶対壁を対応させる改変を行いました。一部の機能を除き上手くいったので(色を変えたりするモーフが対応出来てない)ExShadowSSAOも改変していきます。なお、前回の改変でカメラを動かすと不自然に影が切り替わる不具合があると書きましたが、単に絶対壁の影がミクさんに落ちていただけで正常な動作でした。絶対壁を透明にするとそのような現象は起こりません。なので個人的には改変成功です。
改変方法は前回と同様で絶対壁変形に関わる関数等①②をExShadowSSAOの頂点シェーダの直前に、③をワールド変換?の直前にそれぞれ挿入します。(①②③については前回記事を参照して下さい)
ExShadowSSAOはもともとmqdlさんが作ったもので、それをおたもんさんが改変して更にそぼろさんがExcellentShadow用に改変したものだそうで、それを改変することになるので漠然とした不安があります。プログラムって人によってその作法というのかクセというのかあるみたいで、それを理解出来るかな?っていう・・・でもまあ、やるしかないんだけど。
作業開始
ExShadowSSAOのファイルをざっと確認した結果、改変対象は全部でした。ファイルをコピーしてリネーム。
DepthMap_AW2.fxsub
ExShadowSSAO_AW2.fx
NormalMap_AW2.fxsub
この3ファイルを改変します。したがって ExShadowSSAO.x も
ExShadowSSAO_AW2.x
とコピー&リネームしておきます。
では、ExShadowSSAO_AW2.fx からいきます。
コメントで法線マップと深度マップとあるところにそれぞれ
"* = NormalMap.fxsub";
"* = DepthMap.fxsub";
とあります。多分、ExShadowSSAO_AW2.xをMMDに読み込ませるとMMEが自動的に読み込んでくれるファイルのことだと思うので、両方ともこれから改変するファイル名に書き換えます。
"* = NormalMap_AW2.fxsub";
"* = DepthMap_AW2.fxsub";
次に、コメントでSSAOとあるところの "VS_OUTPUT" が恐らく頂点シェーダのような気がします。VSって多分 VertexShader のことですよね?なのでコメントSSAOの直前に①②を挿入します。そして頂点シェーダの引数にNormalを追加してワールド変換?の直前に③を挿入。下記のようにしました。
VS_OUTPUT VS_SSAO(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.Pos4; // 追加
Out.Pos = Pos;
Out.TexCoord = Tex + ViewportOffset;
return Out;
}
同様にコメント "BlurXY" , "DLAA" , "OutPut" のところをそれぞれ下記の様に改変。
VS_OUTPUT VS_BlurX(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.Pos4; // 追加
Out.Pos = Pos;
Out.TexCoord = Tex + ViewportOffset;
Out.TexCoord2 = Tex + ViewportOffset;
Out.Rang = 1;
return Out;
}
VS_OUTPUT VS_BlurY(float4 Pos:POSITION, float3 Normal : NORMAL, float2 Tex:TEXCOORD0)
{ // ↑ 追加
VS_OUTPUT Out = (VS_OUTPUT)0;
float2 c = float2(0.5, 0.5);
ABSOLUTE_RET ret = (ABSOLUTE_RET)0; // 追加
ret = AbsoluteWall(Pos,Normal); // 追加
Pos = ret.Pos4; // 追加
Out.Pos = Pos;
Out.TexCoord = (Tex + ViewportOffset - c) * fmRange + c;
Out.TexCoord2 = Tex + ViewportOffset;
Out.Rang = fmRange;
return Out;
}
VS_OUTPUT VS_DLAA(float4 Pos:POSITION, float3 Normal : NORMAL, float4 Tex:TEXCOORD0)
{ // ↑ 追加
VS_OUTPUT Out = (VS_OUTPUT)0;
ABSOLUTE_RET ret = (ABSOLUTE_RET)0; // 追加
ret = AbsoluteWall(Pos,Normal); // 追加
Pos = ret.Pos4; // 追加
Out.Pos = Pos;
Out.TexCoord = Tex + ViewportOffset;
return Out;
}
VS_OUTPUT VS_Last(float4 Pos:POSITION, float3 Normal : NORMAL, float4 Tex:TEXCOORD0)
{ // ↑ 追加
VS_OUTPUT Out = (VS_OUTPUT)0;
ABSOLUTE_RET ret = (ABSOLUTE_RET)0; // 追加
ret = AbsoluteWall(Pos,Normal); // 追加
Pos = ret.Pos4; // 追加
Out.Pos = Pos;
Out.TexCoord = Tex + ViewportOffset;
return Out;
}
上書き保存してみると・・・
![](https://assets.st-note.com/img/1655417808169-1bCMUcx4R2.png)
"bump_tex.png" を開けないようです。挿入した①②の一番上のほうにある
#define TEXTURENAME "bump_tex.png"
のことでしょう。このファイルは絶対壁エフェクトのバンプマップで ExShadowSSAO の一つ上のディレクトリにあるからかな?。相対パスで指定するかコピーしてきてもいいのかな?
#define TEXTURENAME "../bump_tex.png"
としたらエラーは消えましたがAOの描画は無いようです。エラーが出てくれないと先に進めないのでしばし考えます。
readmeによるとExShadowSSAOはExcellentShadow専用でそれ単体では機能しません。と言うことはExShadowSSAOとExcellentShadowの間で何らかのやり取りがあるだろうと想像できます。
で、しらみつぶしにファイルを見ていったら "full_ES_pmx.fx" の50行目に
bool Exist_ExShadowSSAO : CONTROLOBJECT < string name = "ExShadowSSAO.x"; >;
とありました。ここの "ExShadowSSAO.x" を "ExShadowSSAO_AW2.x" と書き換えるとAOっぽいのが絶対壁変形前の位置に現れました。
![](https://assets.st-note.com/img/1655669271164-ZObrs3qGO1.png?width=1200)
他のファイルも同様に改変した結果が下図。
![](https://assets.st-note.com/img/1655671726661-QwSTBkce8p.png?width=1200)
上手くいったみたいです。
一応、私に必要な改変は完了しましたが不完全な部分が多々残っています。
・絶対壁エフェクトの色替えモーフ
・MMM対応
・絶対球は無改変、等々
それとこれ以上の改変は私の技量不足でかなりハードルが高いということもあります。今回はこれにて一旦切り上げて、またいつか機会があったら挑戦したいと思います。ではでは。