本日は Unity の小ネタ枠です。
Unityで3Dオブジェクトのポリゴンの裏表の両面を描画する方法を記事にします。
ポリゴンの裏側が描画されない
以下は Unity のデフォルトの Standard シェーダを設定した Plane オブジェクトです。
デフォルトのシェーダではポリゴンの面の裏側が描画されません。
このため、Plane オブジェクトを180度裏返すと以下の通り、見えなくなります。
Cull Off
ポリゴンの裏表の両面が描画されるようにするにはシェーダで Cull Off の設定を利用します。
カリング(Cull)はポリゴンのどちら側をカリングする(描画しない)機能です。
docs.unity3d.com
デフォルトのシェーダでは Cull Back の設定になっており、裏側の描画が行われません。
これは不要な描画が行われることでパフォーマンスが低下することを防ぐためです。
Cull Offのシェーダを作成する
両面の描画を行う Cull Off の設定を行ったシェーダを作成してみます。
Assets フォルダで右クリックから[Create -> Shader -> Standard Surface Shader]を選択し、SurfaceShader を基にしたシェーダファイルを作成します。
今回は CullOffSurfaceShader と名付けました。
ファイルをダブルクリックで開き、Shader の編集を行います。
SubShader{} のセクションに Cull Off の設定を追加して上書き保存します。
これで両面が描画されるシェーダが作成できました。
・CullOffSurfaceShader.shader
次に作成したシェーダを使用するマテリアル(質感設定)を作成します。
Assets フォルダで右クリックから[Create -> Material]を選択し、マテリアルを作成します。
今回は CullOffMaterial と名付けました。
作成したマテリアルの Inspector ビューを開き、[Shader]から使用するシェーダを選択します。
[Custom]の欄をクリックします。
次に表示される[CullOffSurfaceShader]を選択します。
[Custom]下に表示されるのは、Shader ファイルの1行目で[Shader "Custom/CullOffSurfaceShader"]の定義を行っているためです。
これで両面描画のシェーダを使用するマテリアルが作成できました。
動作確認
マテリアルを Plane オブジェクトに反映します。
マテリアルを Scene 画面上の Plane オブジェクトにドラッグすると、マテリアルを反映できます。
これで Plane オブジェクトに両面描画のマテリアルを設定できました。
試しに Plane オブジェクトを180度裏返すと以下の通り、裏側も描画されるようになっています。
Cull Off利用時の注意点
Cull Off を利用する際は表面と裏面で光の反射具合が異なる点に注意が必要です。
上記の例を並べると、表面の方が光をよく反射していることがわかります。
これは面が持つ法線(光の反射方向)は1つのため、裏表では法線の方向が逆になってしまうことが原因です。
光の反射を一定にしたい場合は Cull Off による解決は行わず、ポリゴン自体を修正してポリゴンに厚みを持たせる必要があります。
TIPS
ポリゴンの面の裏表そのものを修正したい場合は以下の記事を参照ください。
bluebirdofoz.hatenablog.com