UE4 ShadingModelでマスクをかけてみる

PostProcessで使うSceneTextureでShadingModelって項目があるんですけど、今回はそれでマスクしてみます

 

 

ShadingModel.png

 

 

なんでそんなことしたの?


先日、ArranLangmeadさんによるポストプレセスでセルシェーディングするチュートリアルが公開されました

 

Cell Shading in Unreal

Cel Shading Post Process

 

日本語だとalweiさんやロイさんが使用している記事があります

 

UE4 比較的安価な手法でトゥーン(セル)シェーディングをやってみる

UE4でセルシェーディング

 

このセルシェーダーですがBloomなどが使えなくなる欠点がありました(なのでチュートリアルではBloomを切るように指示されています)

 

なのでかなり安直な考えですが、光らせたい部分だけShadingModelを分けておいてマスクすることにしました

 

 

他のアプローチはないの?


CustomDepthやCustomStencil、SceneDepthによるマスクを使うことも考えました。このセルシェーダーはSkySphereが真っ黒になってしまう問題があってそれを解決するのにSceneDepthを使いました

 

そのことについてはalweiさんの記事を見ると良いと思います

 

UE4 トゥーン(セル)シェーディングをしたいものに対してのみかける方法

 

ですがBloomなどのメッシュの一部分のみに対してだけとかの場合は有効な方法ではないです。そこでShadingModelによるマスクに目をつけました

 

 

ShadingModelColorを調べよう


調べる方法は2つあります。

 

1.ソースコードから確認する

UE4ソースコードを全てみることが出来るので勿論確認できます

DeferredShadingCommon.usfにGetShadingModelColorという関数があるのでそこで見れます

 

2.Debug系のノードを使ってPostProcessで確認する

調べたいShadingModelのマテリアルをでっかいCubeに適用、PostProcessでDebugのノードを使って出てくる値を見る

 

 

実際にやってみる


下の画像のにわとりくんに実験台になってもらいましょう。今回は翼の部分だけ光らせたいと思います

 

niwatoridefemi.png

 

ShadingModelをUnlitにしてエミッシブに水色に光るように値をいれました。通常時ならば光るところですが今回は特性上光らなくなります。

 

niwatoriemiblack.png

 

PostProcessで次のように組みマスクします。

 

UnlitMask.png

 

光りました!

 

niwatoriemiiiii.png

 

 

実はSkySphereもUnlitなマテリアルを使っているので一緒に回避できます(輪郭線表示する場合はちょっと事情が違うかも…)

 

 

注意点とか欠点とか


1.ある条件下でSkySphereに黒い輪っかが出来てしまう

上の最後でも書きましたが、SkySphereをSceneDepthを用いなくてもこの方法で一緒にマスクできてしまうのですが輪郭線をいれたい時に制約が出来てしまいそうです。

 

マスクのタイミングによってSkySphereに黒い輪っかが出来てしまう場合があります。これを回避すると今度はエミッシブの部分の輪郭線が消えます…

 

ですので、SkySphereはSceneDepthを用いた方が良いと思います

 

2.モデルを作る段階で光らせる部分はマテリアルを分けておかなければならない

テクスチャのマスクで光らせる部分を指定する方法がとれないですね…