遅延レンダリングのやり方として、オフスクリーンに描画して、それをテクスチャとして参照する方法があるようです。
// 法線マップ
texture CM_NormalMap : OFFSCREENRENDERTARGET <
string Description = "NormalMap";
string Format = "D3DFMT_A32B32G32R32F";
float2 ViewPortRatio = {MapTimes,MapTimes};
float4 ClearColor = {0,0,1,0};
float ClearDepth = 1.0;
bool AntiAlias = false;
int Miplevels = 1;
string DefaultEffect =
"self=hide;"
"*=NormalDraw.fx;"; // オフスクリーンレンダリングに使うfxファイル
>;
// サンプラ
sampler NormalMapSampler = sampler_state {
texture = <CM_NormalMap>;
MinFilter = POINT;
MagFilter = POINT;
AddressU = CLAMP;
AddressV = CLAMP;
};
この方法を使えば、メモリと性能の許す限り法線情報や深度情報などのG-Bufferをテクスチャとして参照することができますので、大体やりたいことはできるようになるかなと思います。
その他の方法として、sharedキーワードでエフェクトファイル間でパラメータ共有ができるようで、Excellent Shadowでもshared texture ...としてテクスチャの共有をしているようでしたので、こういうやり方でも実現できるような気はします。
また、肌のところだけ処理を外すといった処理は、techniqueのところでSubsetを指定してあげれば、指定した材質番号だけにエフェクトが適用されるようになるようです。
後は、擬似乱数がかなり適当なのでもうちょっとまともなものにしたいのですが、メルセンヌ・ツイスタやXorShiftなどをMMEで作っている人はいらっしゃらないんですかね。3次元テクスチャを使う方が楽で速いのでいいんでしょうけれど。
実行結果
あぴミクさんとぽっぴっぽーモーション[2]を使用させていただいております。
再生できない場合、ダウンロードは🎥こちら
シフト演算の問題とかDirectX11であれば対応できると思うのですが、MMEのDirectX11版は公開されてないのでしょうか。MikuMikuFlex[3]とか使えばいいんですかね。
fxファイル等(素材画像は入れていません)
LIC_v002.zip
[1] http://www.nicovideo.jp/watch/sm14263863
[2] http://www.nicovideo.jp/watch/sm5838726
[3] http://www.nicovideo.jp/watch/sm22078209
