MRが楽しい

MRやVRについて学習したことを書き残す

Unityで3Dオブジェクトのポリゴンの裏表の両面を描画する

本日は Unity の小ネタ枠です。
Unityで3Dオブジェクトのポリゴンの裏表の両面を描画する方法を記事にします。
f:id:bluebirdofoz:20210908231152j:plain

ポリゴンの裏側が描画されない

以下は Unity のデフォルトの Standard シェーダを設定した Plane オブジェクトです。
f:id:bluebirdofoz:20210908231201j:plain

デフォルトのシェーダではポリゴンの面の裏側が描画されません。
このため、Plane オブジェクトを180度裏返すと以下の通り、見えなくなります。
f:id:bluebirdofoz:20210908231209j:plain

Cull Off

ポリゴンの裏表の両面が描画されるようにするにはシェーダで Cull Off の設定を利用します。
カリング(Cull)はポリゴンのどちら側をカリングする(描画しない)機能です。
docs.unity3d.com

デフォルトのシェーダでは Cull Back の設定になっており、裏側の描画が行われません。
これは不要な描画が行われることでパフォーマンスが低下することを防ぐためです。

Cull Offのシェーダを作成する

両面の描画を行う Cull Off の設定を行ったシェーダを作成してみます。
Assets フォルダで右クリックから[Create -> Shader -> Standard Surface Shader]を選択し、SurfaceShader を基にしたシェーダファイルを作成します。
f:id:bluebirdofoz:20210908231229j:plain

今回は CullOffSurfaceShader と名付けました。
ファイルをダブルクリックで開き、Shader の編集を行います。
f:id:bluebirdofoz:20210908231238j:plain

SubShader{} のセクションに Cull Off の設定を追加して上書き保存します。
これで両面が描画されるシェーダが作成できました。
f:id:bluebirdofoz:20210908231246j:plain
・CullOffSurfaceShader.shader

次に作成したシェーダを使用するマテリアル(質感設定)を作成します。
Assets フォルダで右クリックから[Create -> Material]を選択し、マテリアルを作成します。
f:id:bluebirdofoz:20210908231300j:plain

今回は CullOffMaterial と名付けました。
作成したマテリアルの Inspector ビューを開き、[Shader]から使用するシェーダを選択します。
[Custom]の欄をクリックします。
f:id:bluebirdofoz:20210908231313j:plain

次に表示される[CullOffSurfaceShader]を選択します。
[Custom]下に表示されるのは、Shader ファイルの1行目で[Shader "Custom/CullOffSurfaceShader"]の定義を行っているためです。
f:id:bluebirdofoz:20210908231325j:plain

これで両面描画のシェーダを使用するマテリアルが作成できました。
f:id:bluebirdofoz:20210908231336j:plain

動作確認

マテリアルを Plane オブジェクトに反映します。
マテリアルを Scene 画面上の Plane オブジェクトにドラッグすると、マテリアルを反映できます。
f:id:bluebirdofoz:20210908231348j:plain

これで Plane オブジェクトに両面描画のマテリアルを設定できました。
f:id:bluebirdofoz:20210908231358j:plain

試しに Plane オブジェクトを180度裏返すと以下の通り、裏側も描画されるようになっています。
f:id:bluebirdofoz:20210908231408j:plain

Cull Off利用時の注意点

Cull Off を利用する際は表面と裏面で光の反射具合が異なる点に注意が必要です。
上記の例を並べると、表面の方が光をよく反射していることがわかります。

f:id:bluebirdofoz:20210908231418j:plainf:id:bluebirdofoz:20210908231430j:plain

これは面が持つ法線(光の反射方向)は1つのため、裏表では法線の方向が逆になってしまうことが原因です。
光の反射を一定にしたい場合は Cull Off による解決は行わず、ポリゴン自体を修正してポリゴンに厚みを持たせる必要があります。

TIPS

ポリゴンの面の裏表そのものを修正したい場合は以下の記事を参照ください。
bluebirdofoz.hatenablog.com