積木製作 Unity シェーダー 両面

Unity シェーダーチュートリアル  両面描画

シェーダー

前回のアルファテストの項で出てきた両面描画について、

もう少し詳しく書いていきます。

 

 

 両面描画を有効にする

Unityのシェーダーはデフォルトでは表面しか描画しません。

3次元オブジェクトの多くは閉じているでしょうし(閉じていなくても穴が見えないところにある)、

裏面を描画する必要がないからです。

 

しかし、植物の葉のように開いたオブジェクトの場合は(平面など)、裏面も描画したい場合があります。

裏面の描画を有効にするには SubShader{} 内に以下のコードを記述します。

CGPROGRAM ~ ENDCG の前)


Cull Off

 

これだけです。

 

Cull には以下のようなオプションがあり、

何も記述していない場合は、表面描画が自動的に適用されます。


Cull Off   // 両面描画

Cull Back  // 表面描画

Cull Front // 裏面描画

 

ちなみに CullCulling の省略で、除去です。

表面描画は裏面を除去するので Cull Back です。間違えないようにしましょう。

 

 表・裏で違う表現にする

以下のように SubShader {} 内に、表面用と裏面用にそれぞれ CGPROGRAM ~ ENDCG を記述すると、

表・裏で違う表現が可能になります。


SubShader {

// --- 表面用 ---

Cull Back // まず裏面を除いて(省略可)

CGPROGRAM // 表面用のシェーダーを書く

・・・・・・・・・・

ENDCG

 

// --- 裏面用 ---

Cull Front // 次に表面を除いて

CGPROGRAM // 裏面用のシェーダーを書く

・・・・・・・・・・

ENDCG

}

 

 裏面の影の問題

またまた出ました、影です。何かと曲者ですね。

 

面に影が落ちている場合、Forwardレンダリングだと裏面の影描画が変になります。

Deferredレンダリングだと問題ありません。

 

以下の画像は "表面" を Deferred(左)と Forward(右)でレンダリングしたものです。

Unity シェーダー 両面   Unity シェーダー 両面

 

特に問題はありません。

しかし、"裏面" だとどうでしょうか?

Unity シェーダー 両面   Unity シェーダー 両面

 

Deferred(左)は問題ありませんが、

Forward(右)の場合、影が描画されず枝も変な透け方をしています。

 

これも特別な影シェーダーの記述が必要なのでしょう。(原因までは追ってない・・・)

なぜなら、簡単に解決できる裏技があるからです。

 

前回の記事で、影シェーダーについて触れました。

独自に影の記述をしない場合は、Fallback に指定されたシェーダーの影記述を使う、

というものです。覚えていますか?

Unity シェーダー 両面

 

今回の場合も、Fallback にとあるビルトインシェーダーを指定する事により、

[D]のルートで問題が解決できます。

コレです。


Fallback "Nature/SpeedTree"

 

SpeedTreeの葉シェーダーだと、この現象が起きないのです。

設定するには、FallbackNature/SpeedTree にした後に、以下の手順を踏む必要があります。

① マテリアルを一旦 Nature/SpeedTree (Leaf) にする。

② 続けてカスタムの両面シェーダーに変更する

 

すると、Forward でも裏面の影描画が正しくなりました。

Unity シェーダー 両面

 

 間違った使い方

3DCG屋にとって、常に法線方向を気にしながらモデルを作る事は基本中の基本なのですが、

稀に、裏返っていたり、方向がめちゃくなモデルに出くわす事があります。

 

その場合、簡単だからと言って両面描画を乱用してはいけません。

描画されていても、物理的に表っぽくても、

法線が逆ならばそれは裏なのです。

 

モデリングツールで法線を正しい方向に揃えて、普通に表面描画をしましょう。

  1. […] 両面描画 | Tsumiki Tech Times […]

  2. […] シェーダーチュートリアル 両面描画 | Tsumiki Tech Times […]

  3. […] 両面描画 | Tsumiki Tech Times […]

シェーダー/マテリアルの使い方 [Unity] – Site-Builder.wiki へ返信する キャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)