今回はタイトルにある通り、割とマイナーなマテリアルの機能にフォーカスしてみようと思います。
第1弾は"Two Sided"です。
この機能を有効にするにはマテリアルの詳細パネルにある"Two Sided"をONにします。
これによって何が出来るのか?というと、いわゆる両面ポリゴンを描画することが出来るようになります。
両面ポリゴンはボリュームのあるオブジェクトを描画する際には使用しませんが、布や紙、葉っぱや草などの薄いモデルではまだまだ使用されています。
最初から片面ポリゴン2枚で両面ポリゴンを作成する方法もあるのですが、両面ポリゴンが必要な場所では可能な限りこの機能を使ったほうがポリゴン数は減らせるでしょう。
ただ、一部でしか使用されていないのであればマテリアルを減らす意味でも片面ポリゴン2枚で表現した方がいいかもしれませんね。
さて、両面ポリゴンの問題点の一つは法線方向がどうなるのか、ということです。
両面ポリゴンを描画する際、頂点バッファの入力による法線は裏面でも表面でも表面の方向に向いた法線が入ってきます。
通常、シェーダで両面ポリゴンを実装する場合は、描画されるポリゴンが裏面であれば法線方向を反転させるような処理を行う必要があります。
では、UE4ではどうでしょう?
まず、以下の様な簡単なマテリアルを作成しました。
ベースカラーに白を入れているだけです。
Shading ModelはDefaultLitにしています。
これを球に貼り付け、Two SidedをON/OFFした場合の球の内側の映像が以下となります。
カメラの角度は変わっていませんので、ここから分かる通り、裏面ポリゴンでは法線が反転しています。
両面ポリゴン描画の場合、GBufferに情報を描き込む際、ポリゴン面をチェックして裏面ポリゴンであれば法線を逆転しているようです。
しかし、この処理はGBufferに格納する際の処理であり、マテリアル内部では法線を取得すると表面の方に向いていることになります。
自前ライティングを行いたい人は注意してください。
さて、続きからで裏面ポリゴンのみを描画したい場合の方法について書いていきます。
さて、DirectXでもOpenGLでも、ポリゴンの描画面を表にする、裏にする、両面を描画するの3種類から選べるのが基本です。
しかし、UE4では表面描画と両面描画の2種類しかありません。
では裏面だけ描画したい場合はどうすればいいでしょう?
マテリアルで対応するには、両面描画を行った上で表面ポリゴンだけクリッピングする、という方法になります。
この方法を使用する場合、OpacityMaskを利用するためBlend ModeをMaskedにする必要があります。
まず、ポリゴンが裏面かどうかを判定する関数を作成しましょう。
以下のマテリアル関数がそれです。
TwoSidedSignというノードがありますが、このノードの出力結果はポリゴンが表面なら1.0、裏面なら-1.0となります。
つまりこのマテリアル関数ではポリゴンが裏面なら1.0、表面なら0.0となりますので、出力名のとおりにそのままOpacityMaskにつなげるだけでOKです。
さて、これで何が作れるようになるのかというと、代表的なのはこれです。
ブルーマンの輪郭にアウトラインが出ているのがわかりますか?
このアウトラインはポストプロセスマテリアルでは作成していません。
ブルーマンと同じモデルをもう1度描画、この際には法線方向にモデルを少しふくらませて裏面ポリゴンを描画しています。
この手法のアウトライン描画はまだまだ現役の手法で、最近では『GUILTY GEAR Xrd -SIGN-』にも使われてますね。
ポストプロセスのアウトライン処理に比べるとアーティスティックな調整が可能な手法でもあります。
以下が今回作成したマテリアルです。
ライティングの必要もないのでUnlitで実装しています。
簡単な手法ではありますが、それなりの有用性はあるかと。
しかし、個人的にはこの手法は使わないほうがいいと思っています。
例えば先ほどのブルーマンはBlueprintで実装されていて、2つのスケルタルモデルをMeshComponent2つで定義しているわけです。
スタティックメッシュであればその方法でもそれほど問題ないのですが、スケルタルメッシュではアニメーションの発行を両方のMeshComponentに対して行う必要があります。
アニメーション計算なんかもそれぞれのスケルタルメッシュで行われると思いますので、無駄なコストが多く発生してしまいます。
それを避けるのであれば、アウトラインを入れたいキャラモデルにだけ裏面ポリゴンを用意してやればいいだけです。
この場合はあらかじめ裏面ポリゴンにしておくことが可能なので、前述のようなTwoSidedSignを使った裏面チェックも不要です。
というわけで、あまり使われない機能として"Two Sided"を解説しました。
まあ、布とかなら使い道はあるでしょうけど、今回紹介した手法はあまり使わないでしょうね…