imitation CoD4 NightVision Shader Replacement 1.0

以前のお話から相当経過しておりますが、整理が割と進んできたので再公開。ドキュメント更新とか言っておきながらやってません。代わりにここで書くともいう。

Download : imitation CoD4 NightVision Shader Replacement 1.0

NightEyeのエフェクトをCall of Duty 4のナイトビジョン風味に変更するOblivion用のModです。シェーダの差し替えなのでOBMM0.9.1以降必須です。09年8月18日現在最新のOBMM1.1.12でも動作を確認しました。ビデオカードの性能でピクセルシェーダ2.0以上が必要ですが、Oldvionなどのvanilla以下の設定で遊んでいない限りは問題ないはずです。

使い方は7zを解凍後、中に含まれているomodをOBMMでLoadした後、このModをアクティブにしてください。その際、アスペクト比について問うダイアログが出るので、自身の環境に近い方を選択してください。
16:10の場合は用意しておりませんので適当に選択してください。スコープの円形が真円にならないだけです。

 

dark.jpgneye.jpg

左:通常の暗闇 右:本Mod適用後のNightEye使用時

 

オリジナルのCoD4のやつとの差違が気になる方は、アーカイブに含まれているreadme.txtを参照してください。グレアに関しては、現在はScreenEffectというModがあるので、これをカスタマイズして併用することで再現できるようになるかもしれませんが、未検証です。NightEyeエフェクト時はグレアのテクスチャがレジスタに割り当てられないし、この後にグレアのパスを通過してない雰囲気なので、今回のような単純な手法では無理そうです。

 

その他、リリース後の既知の情報。

非HDR時の動作検証したかどうか覚えてない。

非常に明るいところに行くと(晴れの屋外とか)、スキャンラインが消えてしまう現象を確認しています。恐らくHDR時のみ。saturateしているにも関わらず何故か1を超えてしまうようで(トーンマップとかレンジ変換のたぐい?)、スキャンラインの乗算の影響が薄いようです。

改変おkとかreadmeに書いておきながら、中身はコンパイル済みのバイナリでどうしろというものだったので、以下にシェーダコード掲載。コメントアウトは文字コードの都合上ASCIIだったので適当に書き直しました。

—–

sampler decal;

float4 Main( float2 Tex : TEXCOORD0 ) : COLOR0 {

static const float2 frameSize = { 1024.0f, 768.0f }; // 4:3用width, height
//static const float2 frameSize = { 1280.0f, 720.0f }; // 16:9用width, height
static const float3 luminance = { 0.29891f, 0.58661f, 0.11448f}; // 輝度変換
static const float blueShift = 0.125f; // ブルーシフト量
static const float overShoot = 0.6f; // オーバーシュート閾値
static const float scaling = 2.0f; // ナイトビジョンとしてのスケーリング値
static const float fixedHeight = 400.0f; // スキャンラインバイアス値
static const float2 scanLine = {3.0f, 1.0f}; // スキャンライン間隔
static const float lineContrast = 0.75f; // スキャンライン太さ
static const float aspect = frameSize.y / frameSize.x;
static const float2 fade = {0.35f, 0.5f}; // スコープのフェード値
static const float2 pixelSize = { 1.0f/frameSize.x, 1.0f/frameSize.y };

// カラー取得
float4 color = tex2D( decal, Tex );

// 輝度計算
float l = luminance.x * color.x + luminance.y * color.y + luminance.z * color.z;

// グレアっぽいなにかの計算
float v = max( max(color.x, color.y), color.z);
// 閾値を超えた場合は値を増大させて白飛びを狙う
v = max(v – overShoot, 0); // threshold level
l += v * scaling; // scaling

// カラー変換
float4 output = 0;
output.yz = l; // CoD4のNVは大体緑なので緑と青に1
output.z *= blueShift; // 青はブルーシフトとして利用
output += exp(l) – 1; // 輝度を増幅させる
output = saturate(output);

// modとstepでスキャンラインの作成
float n = fmod( Tex.y * fixedHeight, scanLine.x);
float m = 1.0f – (1.0f – lineContrast) * step(scanLine.x – scanLine.y, n);
output *= m;

// スコープ円の作成
float2 t = Tex – 0.5f; // UVずらし
t.y *= aspect; // アスペクト補正 (ただしオリジナルは16:9版のみ)
float len = length(t);
len = smoothstep(fade.x, fade.y, len); // フェード
output *= 1.0f – len;

return output;
}

—–

今見直してみるともうちょっといい感じに書けるんじゃないかなあ。少なくとも輝度計算は内積で出せるなあ。

あと、blogじゃないstaticな方にもページを作ろうと思ったんですが、Firefoxで見ると表示がおかしいのでその辺直して気が向いたらで。


コメントを残す

メールアドレスが公開されることはありません。