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

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

ビルトインレンダーパイプラインでは、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:

  • If replacementTag is empty (must be an empty string not null), then all objects in the scene are rendered with the given replacement 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 がシェーダーをロードして使用する方法
コンピュートシェーダー
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961