面白い方へ転がっていくブログ

TouchDesignerとかUnityとか色々使って面白そうな方向へ転がっていきます。

Unityちゃんトゥーンシェーダー2.0のアウトラインが、HoloLensのMixedRealityCaptureで透ける問題

問題

Unityちゃんトゥーンシェーダー2.0を適用したモデルが、HoloLens実機で見るとアウトラインが透けずにちゃんと見えているのに、MixedRealityCaptureを通してみるとアウトラインが透けてしまうという問題に遭遇。(画像左がHoloLensをスマホカメラで直撮り、右がMixedRealityCaptureで録画)

f:id:gesyutapo:20180324115527j:plain

どうしたものかとTweetしたのが以下のもの。

この時はトゥーンシェーダーが問題と思っていなくて、アウトラインがほぼ黒(0x0A0A0AFF)だったのが原因なのかな?と思っていたのですが、

デコ・シさん(@Ash_Yin)から教えてもらった、凹みさんの記事を読んでみるとなるほど、と。 実機では黒が透けるけど、録画の場合は黒ではなく純粋にアルファで抜かれるっぽい。

仮説1

ここで最初に立てた仮説は、アウトラインは法線を反転させて表現している(ノーマル反転押出法式)ため、法線が反転すなわちポリゴンの裏側という事で、バックフェイスカリングが効いてなんやかんやで最終的なグラフィックスプレーンにはアルファゼロが書き込まれてしまっているのではないか?と。

そこで、シェーダー設定の「Cull Mode」を「BACK」から「OFF」に変更してみたけど、解決せず。

仮説2

こうなるともうシェーダーの中身を見るしかない。 シェーダー全然わからないけど、きっとアルファの計算とかしてるところがあるだろうから、そこを強制的にイジればなんとかなるだろう。くらいの気持ちでシェーダーコードを見てみる。

なお、アウトライン関連の処理は「UCTS_Outline.cginc」に分離されているので、めっちゃ見やすい!ありがたい! コメントなどを含めても60行弱のコードなので、シェーダーがまったくわからない俺でもなんとかかんとか見る事ができそうです。

頑張って読んでいると、フラグメントシェーダーの最後に気になる記述が。

return fixed4(Set_Outline_Color,0);

あれ?fixed4()の最後の引数ってアルファ?これがゼロで固定されて・・・る? 試しにこれを以下のように書き換えてみる。

return fixed4(Set_Outline_Color,1.0);

これで実行してみると、

f:id:gesyutapo:20180324121709j:plain

キ、キター!!!

と、いうわけで、何とか無事にUnityちゃんトゥーンシェーダー2.0を適用したモデルをMixedRealityCaptureで見ても、アウトラインが透けなくなりました。 でも、これ勝手にアルファいじちゃって良いんだろうかー・・・他の機能に何か影響してるんだろうか。何か知っている方いましたら、教えてください!!

ユニティちゃんライセンス

この作品はユニティちゃんライセンス条項の元に提供されています