読者です 読者をやめる 読者になる 読者になる

だらけ者だらけ

だらけ者だらけの遊び場

CustomDepthを拡張して色も出力してみる。

この記事は UE4 Advent Calender 2015 その1 の16日目の記事にあたります。

前回の記事は@nano06126728さんの何か適当にだしてみますでした。


やったこと: カスタムデプス計算時にカラーもできるようにしました。

本来のマテリアルでは、PixelDepthOffsetが一番下に来ていると思いますが、そこにCustomColorという項目を追加し、好きな値を入れられるようにしました。

f:id:tempkinder:20151210225715p:plain

ここで出力したCustomColorはG-Bufferの拡張領域となりますので、ポストプロセスマテリアルのSceneTextureで参照することができます。

f:id:tempkinder:20151210225722p:plain


非対象者: 拡張したいエンジニアの方へ

具体的な拡張の話はしません。使い道と仕組みについて簡単に説明します。もしも具体的な拡張方法が気になる方は以下のコードに従ってください。 

if (エンジニアでしょうか?)
{
	return; //このブログを閉じて、PixelDepthOffsetの実装をまねてください
}


なぜ実装した?: ①日本で流行るノンフォト、CustomDepth/Stencilをマスクとして行っているものもある。

ご存知の通り、ノンフォトレンダリングが日本で流行っており、UE4でも様々な方が挑戦しております。エピックゲームズジャパンの下田さんも、UnrealFes2015でノンフォトの講演を行っています。
forums.unrealengine.com

ここで、らりほまさんの下記のブログを見てみると、CustomDepthによるエッジのマスクの記載があります。

D言語くん以外のオブジェクトにもクリース線と色の境界線が描画されてしまっているので、マスキングを行います。CustomDepth をマスクとして利用します。
UE4 にて特定の Actor に対して輪郭線・クリース線・色の境界線を描画する、あるいはD言語くんを真の姿にする方法 | rarilog

下記の画像のように陰や背景に不要にエッジがかかってしまうのを防ぐために、マスクが必要という訳です。らりほまさん、画像の転載許可ありがとうございます!!

http://rarihoma.xvs.jp/data/2015/02/22/1/14.png


なぜ実装した?: ②Customdept/Stencilhでは情報が足りない。

便利なCustomDepthですが、そのオブジェクトが出力したデプス値を保存する機能なのでので、ユーザが自由に変更することはできません。

f:id:tempkinder:20151210235145j:plain

そのため、UE4.9から、CustomStencilによって好きな値を1つ出力できるようになりました。

f:id:tempkinder:20151210235350j:plain

しかし、このステンシルも問題があります。このステンシル値は、メッシュのレンダリング項目でのみ設定できます。

f:id:tempkinder:20151210235550j:plain

つまり、メッシュ単位で任意の一つの値しか出力できません。1つのメッシュの中でも、キャラクタの目や眉毛にはエッジをかけてほしくないとか。。。鼻筋のエッジラインは非常に細くしたいとか。。。エッジをより詳細に調整したいとなると、ステンシルやデプス値では限界があります。そんなこんなで、デプスもステンシルも出力するならば、カラーも一緒に出力するようにすればいいじゃん。そして、その値を好きにマテリアルで調整できれば、マスクだけじゃなくて特殊な使い方をしたい場合など、幅広く貢献できるかなと思って作ってみました。

使用例

ごめんなさい。具体的にノンフォトレンダリングに適用したかったんですが、アセットが間に合いませんでした。。基本的には、好きなものを出力して好きに使えばよいだけです。一例としては、カスタムデプスやステンシルのマスキングでは制御できないようなマスクを作ることでしょうか。例えば下記のように、そのままのエッジ抽出アルゴリズムだと、目、口、鼻に過剰なエッジが出てしまいます。(実はこのエッジアルゴリズムだと眉毛もほんのり赤くなる。)

f:id:tempkinder:20151213213826p:plain

CustomColorでマスキングして省くことができます。

f:id:tempkinder:20151213213839p:plain


後はマテリアルIDなど、エッジの色や太さの制御など、やりたいことをご自由にというものです。このようにエッジを細かく制御して実際の製品で実現させたのが、俺屍2です。CEDECで具体的な実装について説明していますので、ご参考にしてください。ノンフォトレンダリングは、制御の難しさから、検証レベルまではいけるもののプロダクションレベルまで持ってくのが非常に難しい技術かと思います。これを携帯器PSVitaで実現させた素晴らしい成功例かと思います。
cedec.cesa.or.jp
www.inside-games.jp



注意点: CustomDepthには負荷があります。オブジェクトをもう一度投入してレンダリングします。

f:id:tempkinder:20151210231613j:plain

ProfileGPUを見るとG-Bufferを作成する"BasePass"というものとは別の場所にCustomDepthという項目があります。CustomDepthがOnのオブジェクトは、もう一度GPUに投入されデプスが計算されるため追加の負荷がかかります。(本当は、もう一度投入するなんて暴挙に出るのならばカラーも出してしまえと思って拡張をしたのが発端です。)

読んでいただきありがとうございます。

f:id:tempkinder:20140112120104j:plain

明日は、ntaro@年末に向けて準備中 (@tarotarokun) | Twitterさんの「標準のUE4だとWindowsのマルチタッチが使えないための対応方法を書きます」です。インプットデバイス関連には疎いので、勉強させていただきます!