いくつかのレンダリングエフェクトは異なるセットのシェーダーを用いてシーンをレンダリングする必要があります。例えば、優れたエッジ検出には、表面の凸凹が異なるエッジを検出するために、シーンに法線のあるテクスチャが必要です。他のエフェクトでも、シーンにデプスのあるテクスチャが必要だったり、と続いていきます。これを達成するためには、シーンを、すべてのオブジェクトを置き換えたシェーダー( Replaced Shader )でレンダリングすることができます。
シェーダーの置き換えをスクリプティングで行うためには、Camera.RenderWithShader や Camera.SetReplacementShader 関数を使用します。両方の関数は shader と replacementTag を使用します。
次のように動作します。カメラはシーンを通常どおりにレンダリングします。オブジェクトはマテリアルを使用しますが、実際に使用されることになるシェーダーが変更されます。
もしすべてのシェーダーが、例えば、“RenderType” タグが “Opaque”、“Transparent”、“Background”、“Overlay” の値であった場合、不透明なオブジェクトのみレンダリングする Replacement Shader を、RenderType=Solid tag であるひとつのサブシェーダーを使用して、記述することができます。他のタグのタイプは Replacement Shader で見つからないため、オブジェクトはレンダリングされません。あるいは複数のサブシェーダーを、異なる“RenderType” のタグの値のために、記述することができます。なお、すべての Unity ビルトインシェーダーは “RenderType” タグのセットを持っています。
Shader Replacement を使用するとき、シーンはカメラで設定されたレンダリングパスを使用してレンダリングされます。つまり Replacement に使用されるシェーダーはシャドウやライティングパスを含めることができるということです(サーフェイスシェーダーを Shader Replacement に使用できます)。これは特殊エフェクトのレンダリングやシーンのデバッグに便利です。
すべての Unity ビルトインシェーダーは “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番目の置き換えシェーダーを使用し、以下、同様に続きます。シェーダーが指定された置き換えキーと合致するタグを持たない場合、そのオブジェクトはレンダーされません。