#memo

indiedev太郎

UE4でカメラ実装: シャッタースピードの実装

最後の関門感のあるシャッター速度
実装方法を練っていく

まず現実のシャッター速度周りを見てみる、光量調節、絞りも光量調節
この2つの値と光量からわかる適正露出みたいなのがある、適正露出算出の仕組みってどんなのか調べる

露出 (写真) - Wikipedia

適正露出、脳死で参考画像の表を利用したいところ
どこかを基準にしておいて(プレイヤーの視線カメラが濃厚)、絞りの値をそのまま暗みに比例させたらよさそう、調節はかなりアートな感じで
シャッターの間数枚この画像を書き出して、OpenCVで重ねあわせたら写真が得られそう
もちろん毎Tick画像書き出して合成とかはできなさそうなので、もうちょっと雑にやらないといけない

出てきた画像の合成は単純にaddで良さそうと思ったけど、256階調しかないし、完全な黒はこれだと無限に黒のままだ
ネットで適当に探してきたアンダーな写真をAddで合成したらかなり酷い、スクリーンは結構それっぽく光量が上がる感じがある

Photoshopの描画モード(ブレンドモード)を理解するための、画像合成は計算だという話 | 俺CG屋

1.0 -{1.0 -(基本色 / 255)} × {1.0 -(合成色 / 255)} = 結果 / 255

結果 = 基本色 + 合成色 -(基本色 × 合成色)/ 255

スクリーンの計算式、結構単純なので使えそうならこれで行こう、重いならAddで
C++だとこんなかんじ

Mat tmpA;
Mat tmpB;
mSrcA.convertTo(tmpA, CV_32FC3, 1.0 / 255);
mSrcB.convertTo(tmpB, CV_32FC3, 1.0 / 255);

Mat Result = tmpA + tmpB - tmpA.mul(tmpB);

Result.convertTo(Result, CV_8UC3, 255);

レンダリング間隔、最小単位を0.1秒とかにしてみる、シャッタースピードが1/10なら1枚、1/5なら2枚を合成する
でも2枚だと、ブレみたいなのがやっぱり出ない気がする、ブレはブラーで、レンダリング開始から次のレンダリング開始までのカメラの方向のベクトルの差を使えそう、この距離分だけブラーを1枚の画像にかける、あとプレイヤーの移動距離も入れないといけない
スクリーンショットだとモーションブラーが入っていていい感じなのだけれど、RenderTargetを利用するやり方だとおそらく出てくれない

ただ何もカメラを100%再現使用ってわけじゃないし、そこまでの厳密性はいらないので、動作優先で作っていく


まずはスクリーンの合成の塩梅を見ていく、とりあえずポスプロで暗くしたものをテクスチャにして、それにスクリーンをかける

ポスプロで光量を落とすのは、Scene ColorのTintに黒を入れている、もっと良さそうなパラメーターがあるかもしれない
ついでに彩度もちょっと下げる

Tint: 0.015 スクリーン 2回合成
https://i.gyazo.com/089f798312f26c0f6ca4e2057bcd2100.png

思っていたより黒つぶれが酷い、あと白はかなり明るくなってしまう

Tint: 0.15 スクリーン 2回合成
https://i.gyazo.com/467a986ec3454371c0732faac1a14ef0.png
雰囲気は結構いい感じだけれど、黒つぶれしない範囲の明るさだと2回でこんなに明るくなってしまう

ちなみに同条件で合成モードをAddにしたもの
https://i.gyazo.com/425230eaab98e94819273760e5bb169d.png
https://i.gyazo.com/55b4059372e5f26acf40a4e52c30117a.png

コントラストがきつくなっていて、最悪がある、スクリーンでなんとか暗さを制御することにする

スクリーンでやるいうことでとりあえず2枚の画像を合成してみる、感覚は1秒
Tint: 0.15 Saturation 0.55 スクリーン 2回合成 間隔1s
https://i.gyazo.com/4bd432903dc7f4951e3492d70e8444f1.png

なんかそれっぽいけど、ブラーいるな!みたいなのある、

続き
UE4でカメラ実装: シャッタースピードの実装2 - #memo