ビルトインレンダーパイプラインでは、Camera に指示してランタイムに特定のジオメトリを描画するために使用するシェーダを変更できます。これは、エッジ検出などの視覚効果を得るために行う場合があります。
Shader replacement is done from scripts with either the Camera.RenderWithShader or Camera.SetReplacementShader function. Both functions take a shader and a replacementTag.
It works like this: the camera renders the scene as it normally would. The objects still use their materials, but the shader they use changes:
もしすべてのシェーダーが、例えば、“RenderType” タグが “Opaque”、“Transparent”、“Background”、“Overlay” の値であった場合、不透明なオブジェクトのみレンダリングする Replacement Shader を、RenderType=Solid tag であるひとつのサブシェーダーを使用して、記述することができます。他のタグのタイプは Replacement Shader で見つからないため、オブジェクトはレンダリングされません。あるいは複数のサブシェーダーを、異なる“RenderType” のタグの値のために、記述することができます。なお、すべてのビルトインシェーダーのオブジェクトは “RenderType” タグのセットを持っています。
Shader Replacement を使用するとき、シーンはカメラで設定されたレンダリングパスを使用してレンダリングされます。つまり Replacement に使用されるシェーダーはシャドウやライティングパスを含めることができるということです(サーフェイスシェーダーを Shader Replacement に使用できます)。これは特殊エフェクトのレンダリングやシーンのデバッグに便利です。
すべてのビルトインシェーダーは “RenderType” タグのセットを持ち、Replaced Shader で使用することができます。タグの値は以下のとおりです。
カメラには内蔵で、どれかのエフェクトで必要な場合に、テクスチャのデプスまたはデプス+法線をレンダリングする機能があります。カメラの深度テクスチャ を参照してください。いくつかのケース(ハードウェアによって)、テクスチャのデプスまたはデプス+法線は内部的に 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番目の置き換えシェーダーを使用し、以下、同様に続きます。シェーダーが指定された置き換えキーと合致するタグを持たない場合、そのオブジェクトはレンダリングされません。