Version: 2017.1
シェーダーを書く場合のパフォーマンスのヒント
カスタムシェーダー GUI

Replaced Shaders でのレンダリング

いくつかのレンダリングエフェクトは異なるセットのシェーダーを用いてシーンをレンダリングする必要があります。例えば、優れたエッジ検出には、表面の凸凹が異なるエッジを検出するために、シーンに法線のあるテクスチャが必要です。他のエフェクトでも、シーンにデプスのあるテクスチャが必要だったり、と続いていきます。これを達成するためには、シーンを、すべてのオブジェクトを置き換えたシェーダー( Replaced Shader )でレンダリングすることができます。

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

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

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

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

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

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

Unity ビルトインシェーダーでの Replacement Shader タグ

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

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

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

カメラには内蔵で、どれかのエフェクトで必要な場合に、テクスチャのデプスまたはデプス+法線をレンダリングする機能があります。カメラの深度テクスチャ を参照してください。いくつかのケース(ハードウェアによって)、テクスチャのデプスまたはデプス+法線は内部的に 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番目の置き換えシェーダーを使用し、以下、同様に続きます。シェーダーが指定された置き換えキーと合致するタグを持たない場合、そのオブジェクトはレンダーされません。

シェーダーを書く場合のパフォーマンスのヒント
カスタムシェーダー GUI