夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ShaderGraphでメッシュの裏表を取得する

本日はShader学習枠です。

〇メッシュの裏と表

3DCGではメッシュごとに法線(ノーマル)を持っており、裏表を持っています。

Blenderではメッシュの向きを表が青、裏が赤で表示できます。

 Unityへインポートされた3Dモデルのメッシュも面の向きを持っており、デフォルトではメッシュの表面のみが描画され、裏面は描画されないようになっています。

 この仕組みは描画時の最適化の一つでカリングと呼ばれています。

 メッシュの両面を描画するためにはShader内でのカリングの処理をOff(無効)にする必要があります。 コードでは以下のようになります。

```

Shader "Custom/ColorFilterShader" { Properties {

}
SubShader
{
    Tags {  }
    Cull Off //追加
    Pass
    {

  }

} }


また、面の表と裏で別の処理を行うこともできます。 


この場合はセマンティクスを使用して面の向きを取得することができます。

[https://redhologerbera.hatenablog.com/entry/2022/02/07/211259:embed:cite]

fixed4 frag (v2f i,fixed facing:VFACE) : SV_Target { fixed4 col =facing >0 ? fixed4(1,1,1,1):fixed4(1,0,0,1); return col; }

今回はこのメッシュの裏表の取得をShaderGraphで行います。

### 〇ShaderGraphでのメッシュの裏表の取得

 ShaderGraphでは、**Is front Face**ノードを使用することで面の表裏を取得できます。

 [f:id:Holomoto-Sumire:20220502213220p:plain]

**Is front Face**ノードを配置します。

 [f:id:Holomoto-Sumire:20220502213525p:plain]

**Is front Face**ノードの出力はブーリアン型であり真偽で返されます。 このため**branch**ノードなどに接続して使用します。

 面の表面のピクセルは**True**、裏面は**False**が返されます。
 
 [f:id:Holomoto-Sumire:20220502213751p:plain]

**branch**ノードに適当な色を接続します。

 [f:id:Holomoto-Sumire:20220502214029p:plain]

最後にFragmentブロックを選択し、GraphInspectorから[**Tow Sided**]にチェックを入れます。これによって面の裏面が描画されるようになります。

[f:id:Holomoto-Sumire:20220502214150p:plain]


これで面の表と裏面で異なる色のシェーダーが完成しました。ここではBlenderに合わせて面の表は青、裏面は赤に描画するようにしています。

[f:id:Holomoto-Sumire:20220502214322p:plain]


[f:id:Holomoto-Sumire:20220502214348p:plain]

本日は以上です。