Version: 2021.1
Shader variant collections
コンピュートシェーダー

Replacing shaders at runtime

In the Built-in Render Pipeline, you can tell a Camera to change the shader that it uses to render certain geometry at runtime. You might do this to achieve a visual effect such as edge detection.

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

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

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

So if all shaders would have, for example, a “RenderType” tag with values like “Opaque”, “Transparent”, “Background”, “Overlay”, you could write a replacement shader that only renders solid objects by using one subshader with RenderType=Solid tag. The other tag types would not be found in the replacement shader, so the objects would be not rendered. Or you could write several subshaders for different “RenderType” tag values. Incidentally, all built-in Shader objects have a “RenderType” tag set.

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

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

Shader replacement tags in built-in shaders

All built-in shaders have a “RenderType” tag set that can be used when rendering with replaced shaders. Tag values are the following:

  • 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番目の置き換えシェーダーを使用し、以下、同様に続きます。シェーダーが指定された置き換えキーと合致するタグを持たない場合、そのオブジェクトはレンダリングされません。

Shader variant collections
コンピュートシェーダー