妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

ポストプロセスマテリアルによる簡易LUT

f:id:una_unagi:20170414235450p:plain

f:id:una_unagi:20170414235457p:plain

「ルックアップテーブル(LUT)による色変換で、色々情報をもらったんだけど、今のところ中間色が出ないようなLUTを使う方法は見つかってなくて、それでポストプロセスの標準機能ではなく、マテリアルでそういう処理を組めばいいのでは? と思ってやってみたのがコレ」

f:id:una_unagi:20170414235705p:plain
RGBのデータを元に、LUT上のUV値を計算
たぶん正確じゃない計算式
使用するのはポストプロセス用のLUTと同じテクスチャ

f:id:una_unagi:20170414235715p:plain
Nearestを設定すると補完なし(くっきり表示)になる

妹「上のはちゃんと2色になってるね。もう一個の方は?」

「こっちは標準のLUTを補完無しで使った場合。RGBが16段階になるから色が劣化して見える。これを補完ありで使う事もできるんだけど……」

f:id:una_unagi:20170415000200p:plain

妹「なんだろ……普通に見えるけど、なんだか微妙に汚いような……黄色いシミ?」

「本来はマテリアルがあってもなくても同じに見えるはずだけど、なんかそうなる。黒いとこに赤が混ざったりとか。RGBからUV値に変換する計算が上手くいってないのかなと思うけど。そもそも標準機能じゃないからあんまり高速でもないし、単純な2値化ぐらいだったら昨日みたいに計算する方がよさそう。でもレトロゲーム風表示とかで、使える色との対応が計算で求めにくい場合は、この方法が使えると思う」

ポストプロセスマテリアルを使った2値化+輪郭線

f:id:una_unagi:20170413230127p:plain

f:id:una_unagi:20170413230724p:plain

「LUTによる2値化は上手く行かなかったので、ポストプロセスマテリアルで作ったみた」

妹「白黒じゃないんだ」

「原理的にはこれ何色でもいいから、今回は淡い色合いにして、それにプラスして先日作った輪郭線のマテリアルも入れた。どっちもタイミングの設定はAfterTonemappingになってて、2値化が先で、次に輪郭線という順番」

f:id:una_unagi:20170413231808p:plain

「逆だと線の部分も2値化されるから、こういう風になる」

妹「この人グレーマンだよね? 全然グレーじゃなくなるね」

「こうなるともう元のマテリアルがどうとか全然わかんないから、誰が作ったアセットでも統一感が得られるというメリットがある。同じ色を使った2Dのイラストを混ぜこんだりとかも出来そう」

妹「これマテリアルのノードだと、どっちも白がつないであるみたいに見えるんだけど」

「ノード画面ではsRGBプレビューの色が見えるけど、実際に出てくるのはsRGBじゃない方の色で、プレビューの見た目よりちょっと暗い色になる。色指定用のConst3Vectorノードをダブルクリックして、詳細画面を出すと正しい色がわかる」

f:id:una_unagi:20170413231249p:plain

ポストプロセス LUTの弱点・階調化フィルタ

f:id:una_unagi:20170413014027p:plain

f:id:una_unagi:20170413014424p:plain

「昨日はピクセルの場所に関係ないフィルタならいけるって書いちゃったけど、厳密に言うとそれでも駄目なやつがある。例えば上のスクリーンショットは2値化フィルタを書けたLUTを使ってるんだけど」

妹「2値になってないね。グレーがいっぱいある」

「グレー部分が出来るのはポストプロセス処理が完全に無効化出来てないせいのもありそうなんだけど、二値化処理自体にも問題がある。LUTって、16x16の画像を横に16個並べた、256x16というサイズの画像を使ってる。でもこれだと色は4096種類しかない。RGBそれぞれが16段階しかないということ」

妹「わたしが知ってるやつは、0から255までと書いてあったような」

「今のパソコンの、いわゆるフルカラー表示というのはそうなってる。256階調。だからLUTにピッタリ同じ色がないっていう場合はしょっちゅうあって、そういう時はご近所の色から計算して中間の色で表示することになってる。だから黒と白の境界線あたりの色はグレーになる可能性がある。偶然そういう色がなければ2階調に見えることもあるだろうけど」

妹「白と黒だけで表示したい場合はどうすれば?」

「基本的にはポストプロセスマテリアルでやるのが良さそうな気がする。いったん16階調化するポストプロセスマテリアルを実行して、その後LUTを通すという案も試してみたんだけど、どうも狙った色にならずに成功しなかった」