Version: 2022.3
言語: 日本語
Unity がシェーダーをロードして使用する方法
コンピュートシェーダー

ランタイムのシェーダーの置き換え

ビルトインレンダーパイプラインでは、Camera に指示してランタイムに特定のジオメトリを描画するために使用するシェーダを変更できます。これは、エッジ検出などの視覚効果を得るために行う場合があります。

シェーダーの置き換えをスクリプトで行うためには、Camera.RenderWithShader 関数または Camera.SetReplacementShader 関数を使用します。両方の関数は shaderreplacementTag を使用します。

次のように動作します。カメラはシーンを通常どおりにレンダリングします。オブジェクトは引き続きマテリアルを使用しますが、使用するシェーダーが変更されます。

  • replacementTag が空 (null ではなく空の文字列であることが必要です) の場合、シーンのすべてのオブジェクトは、指定された Replaced Shader でレンダリングされます。
  • replacementTag が空でない場合、レンダリングされる各オブジェクトは、
    • 実際のオブジェクトのシェーダーは ShaderLab :サブシェーダータグ でクエリーを実行します。
    • そのタグを持たない場合、オブジェクトは レンダリングされません
    • Replacement Shader で指定されたタグの値での サブシェーダー が見つかります。そのような SubShader が見つからない場合、オブジェクトは レンダリングされません
    • 次にその SubShader を使用してオブジェクトがレンダリングされます。

もしすべてのシェーダーが、例えば、“RenderType” タグが “Opaque”、“Transparent”、“Background”、“Overlay” の値であった場合、不透明なオブジェクトのみレンダリングする Replacement Shader を、RenderType=Solid tag であるひとつのサブシェーダーを使用して、記述することができます。他のタグのタイプは Replacement Shader で見つからないため、オブジェクトはレンダリングされません。あるいは複数のサブシェーダーを、異なる“RenderType” のタグの値のために、記述することができます。なお、すべてのビルトインシェーダーのオブジェクトは “RenderType” タグのセットを持っています。

Shader Replacement でオブジェクトを照らす

Shader Replacement を使用するとき、シーンはカメラで設定されたレンダリングパスを使用してレンダリングされます。つまり Replacement に使用されるシェーダーはシャドウやライティングパスを含めることができるということです(サーフェイスシェーダーを Shader Replacement に使用できます)。これは特殊エフェクトのレンダリングやシーンのデバッグに便利です。

ビルトインシェーダーのシェーダー置き換えタグ

すべてのビルトインシェーダーは “RenderType” タグのセットを持ち、Replaced Shader で使用することができます。タグの値は以下のとおりです。

  • Opaque: ほとんどのシェーダー(NormalSelf IlluminatedReflective、Terrain シェーダー)。
  • Transparent: ほとんどの部分が透過なシェーダー(Transparent、パーティクル、フォント、Terrain 追加パスシェーダー)。
  • TransparentCutout: マスキングされた透過シェーダー(Transparent Cutout、2 パス植生シェーダー)。
  • Background: Skybox シェーダー。
  • Overlay: ハロー、フレアシェーダー。
  • TreeOpaque: Terrain エンジン Tree の樹皮。
  • TreeTransparentCutout:Terrain エンジン Tree 葉っぱ。
  • TreeBillboard: Terrain エンジンビルボードの 木。
  • Grass: Terrain エンジンの 草。
  • GrassBillboard: Terrain エンジンビルボードの 草。

内蔵のシーンデプス/法線テクスチャ

カメラには内蔵で、どれかのエフェクトで必要な場合に、テクスチャのデプスまたはデプス+法線をレンダリングする機能があります。カメラの深度テクスチャ を参照してください。いくつかのケース(ハードウェアによって)、テクスチャのデプスまたはデプス+法線は内部的に Replacement Shader でレンダリングできることに注意してください。このためシェーダーに正しい “RenderType” タグがあることが重要です。

コード例

Start() 関数は、置き換えるシェーダーを指定します。

void Start() {
    camera.SetReplacementShader (EffectShader, "RenderType");
}

これは、EffectShader が RenderType をキーとして使用することを要求しています。EffectShader は、それぞれの RenderType の Key-Value タグを所有しています。シェーダーは以下のようになります。

Shader "EffectShader" {
     SubShader {
         Tags { "RenderType"="Opaque" }
         Pass {
             ...
         }
     }
     SubShader {
         Tags { "RenderType"="SomethingElse" }
         Pass {
             ...
         }
     }
 ...
 }

SetReplacementShader はシーン中のすべてのオブジェクトを検索し、通常のシェーダーを使用する代わりに、指定されたキーに合致する最初のサブシェーダーを使用します。この例では、Rendertype=“Opaque” タグをもつすべてのシェーダーは EffectShader 内の最初のサブシェーダーに置き換えられます。RenderType=“SomethingElse” タグをもつシェーダーはすべて、2番目の置き換えシェーダーを使用し、以下、同様に続きます。シェーダーが指定された置き換えキーと合致するタグを持たない場合、そのオブジェクトはレンダリングされません。

Unity がシェーダーをロードして使用する方法
コンピュートシェーダー