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