Version: 2021.2
言語: 日本語
レンダーテクスチャ
ムービーテクスチャ

カスタムレンダーテクスチャ

Custom Render Textures (カスタムレンダーテクスチャ) は特別なタイプのテクスチャで、これを使うとシェーダーでテクスチャを更新することができます。これは、レンダーテクスチャ を拡張したものです。カスタムレンダーテクスチャを使用すると、コースティクス、雨の効果のためのリップルシミュレーション、液体のしぶきなどの複雑なシミュレーションを作成することができます。

カスタムレンダーテクスチャ機能はスクリプトやシェーダーのフレームワークを提供し、更新頻度の変更、部分的更新、マルチパスの更新などのさらに複雑な設定をサポートします。

このフレームワークを使用するには、Custom Render Texture アセットにマテリアルを割り当てる必要があります。Custom Render Texture には、互換性のあるマテリアルが必要です。詳しくは、カスタムレンダーテクスチャのシェーダーの作成 を参照してください。

互換性のあるマテリアルを Custom Render Texture アセットに割り当てるには、以下を行います。

  1. 新規に Custom Render Texture アセットを作成します。
  2. Custom Render Texture アセットの Material プロパティで、互換性のあるマテリアルを割り当てます。

このマテリアルは、パラメーターに応じてテクスチャのコンテンツを更新します。

このページには以下の情報が含まれています。

レンダーパイプラインの互換性

次の表は、Custom Render Textures 機能と各レンダーパイプラインの互換性について説明します。

機能 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタムのスクリプタブルレンダーパイプライン (SRP)
カスタムレンダーテクスチャ あり (1) あり (1) あり (1) あり (1)

ノート:

  1. 現在、Shader GraphCustom Render Textures を更新し初期化するマテリアルを作成することはできません。ShaderLab コードを書くことによってのみ、Custom Render Textures を操作するシェーダーを作成することができます。

プロパティ

カスタムレンダーテクスチャ の Inspector ウィンドウには、レンダーテクスチャの Inspector ウィンドウと同じプロパティが多数と、Custom Render Textures に固有のプロパティも表示されます。

レンダーテクスチャ

プロパティ 機能
Dimension レンダーテクスチャの次元
     2D レンダーテクスチャを 2D にします。
     Cube レンダーテクスチャをキューブマップにします。
     3D レンダーテクスチャを 3D にします。
Size レンダーテクスチャのサイズ (ピクセル)
Color Format レンダーテクスチャの色の形式
sRGB (Color Render Texture) これを有効にすると、レンダーテクスチャで sRGB の読み取り/書き込みの変換が可能なります (読み取り専用)。
Enable Mip Maps これを有効にすると、レンダーテクスチャがミップマップを使用できるようになります。
Auto generate Mip Maps これを有効にすると、ミップマップが自動的に生成されます。
Wrap Mode タイルにするときのテクスチャの動作を設定します。
     Repeat テクスチャ自体をタイルとして繰り返します。
     Clamp テクスチャのエッジを伸ばします。
Filter Mode 3D 変換によってテクスチャが引き伸ばされるときに、Unity がテクスチャをどのようにフィルタリングするかを定義します。
     Point テクスチャに近づくと、ブロック状に見えます。
     Bilinear テクスチャに近づくと、ぼやけて見えます。
     Trilinear Bilinear に似ていますが、テクスチャは異なるミップレベル間でもぼかされます。
Aniso Level 急角度から見たときのテスクチャの品質を向上します。床や地面のテクスチャに適しています。

カスタムテクスチャ

これらのプロパティは、カスタムレンダーテクスチャ専用です。カスタムテクスチャのパラメーターは 3 つのカテゴリに分かれています。

  • Material: テクスチャを更新するのにどのシェーダーを使用するかを決定します。

  • Initialization: シェーダーが更新を行う前に、どのようにテクスチャを初期化するかを操作します。

  • Update: シェーダーがテクスチャを更新する方法を制御します。

プロパティ 機能
Material カスタムレンダーテクスチャを更新するために使用されるマテリアル。
     Shader Pass Unity がカスタムレンダーテクスチャを更新するために使用するシェーダーパス。マテリアルに使用できるすべてのパスがドロップダウンに表示されます。
Initialization Mode Unity がテクスチャを初期化する頻度。
     OnLoad Unity は作成時に 1 度だけテクスチャを初期化します。
     Realtime Unity はフレームごとにテクスチャを初期化します。
     OnDemand Unity は、スクリプトからの要求に応じて、テクスチャを初期化します。
Source Unity がテクスチャを初期化する方法。
     Texture and Color Unity では、テクスチャとカラーの積によって初期化されたテクスチャを使用します。
         Initialization Color Unity がカスタムレンダーテクスチャの初期化に使用する色を定義します。Initialization Texture (初期化用テクスチャ) も提供している場合、Unity はカスタムレンダーテクスチャを初期化するために、色とテクスチャの乗算を使用します。
         Initialization Color Unity がカスタムレンダーテクスチャの初期化に使用するテクスチャを定義します。Initialization Color (初期化用カラー) も提供している場合、Unity はカスタムレンダーテクスチャを初期化するために、色とテクスチャの乗算を使用します。
     Material Unity では、マテリアルを使ってテクスチャを初期化します。
         Initialization Material カスタムレンダーテクスチャを初期化するために使用されるマテリアル。
Update Mode シェーダーがカスタムレンダーテクスチャを更新する頻度
     OnLoad シェーダーは作成時に 1 度だけテクスチャを更新します。
     Realtime シェーダーはフレームごとにテクスチャを更新します。
     OnDemand シェーダーは、スクリプトからの要求に応じて、テクスチャを更新します。
Period Unity がリアルタイムテクスチャを更新する時間を秒単位で指定します。0.0 の値では、毎フレーム更新されます。このプロパティは、 Update Mode が Realtime に設定されている場合にのみ使用できます。
Double Buffered テクスチャをダブルバッファリングします。各更新は、2 つのバッファを入れ替えます。これにより、ユーザーはシェーダー内の以前の結果を読み取ることができます。
Wrap Update Zones 部分的な更新ゾーンがテクスチャの境界線の周りを包むようにできます。
Cubemap Faces (キューブ マップのみ) 一連の切り替えによって、キューブマップの表面の更新を有効/無効にすることができます。
Update Zone Space Unity が更新ゾーンを定義する座標系です。
     Normalized 座標とサイズはすべて 0 と 1 の間で、(0, 0) の左上の角から始まります。
     Pixel すべての座標とサイズはピクセルで表示され、テクスチャの幅と高さに制限されます。(0, 0) の左上の角から始まります。
Update Zone List テクスチャの更新ゾーンのリスト。詳細は Update Zones を参照してください。

エカスタムレンダーテクスチャをファイルにエクスポート

“Export” メニューで、カスタムレンダーテクスチャを PNG や EXR ファイル (テクスチャ形式による) にエキスポートできます。

Update Zones

Unity がカスタムレンダーテクスチャを更新すると、デフォルトでは、マテリアルを使って一度にテクスチャすべてを更新します。カスタムレンダーテクスチャを使うと、特定の更新を行うゾーンを定義することができます。これにより、必要なだけゾーンを作成し、処理する順序を定義できます。

Update Zone (更新ゾーン) は、いくつかの異なる目的のために利用できます。 例えば、テクスチャ上に複数の小さなゾーンを作りテクスチャに水滴を飛び散らせ、それから、リップルをシミュレーションするためにフルパスを実行します。テクスチャ全体を更新する必要がないことがわかっているときに、これを最適化の 1 つとして使用することもできます。

Update Zones にはそれ自体の一群のプロパティーがあります。Update Zone Space は画面に反映されます。テクスチャの Dimension によって、座標は 2D (2D テクスチャとキューブテクスチャ用) か 3D (3D テクスチャ用) になります。

プロパティ 機能
Center 更新ゾーンの中心座標
Size 更新ゾーンのサイズ
Rotation 更新ゾーンの方向の角度 ( 3D テクスチャでは利用できません)。
Shader Pass このアップデートゾーンに使用するシェーダーパスを定義します。このプロパティをデフォルトで設定する場合、この更新ゾーンはインスペクターのメイン部分で定義したシェーダーパスを使用します。それ以外の場合は、指定したシェーダーパスが使用されます。
Swap (Double Buffer) (ダブルバッファされたテクスチャのみ) このプロパティを有効にすると、Unity はこの更新ゾーンを処理する前にバッファを交換します。

スクリプトのカスタムレンダーテクスチャを制御

カスタムレンダーテクスチャのほとんどの機能は、Scripting API でアクセスできます。スクリプトを使って、マテリアルのパラメーター、更新頻度、更新ゾーン、更新のリクエストなどを変更することもできます。

Unity がカスタムレンダーテクスチャを更新または初期化すると、現在のプロパティを使用して次のフレームのレンダリングをします。これにより、このテクスチャを使用するマテリアルには、最新の結果が保証されます。例えば、以下のスクリプトでは、Unity は 2 番目の Update Zone 配列を使って 2 つのアップデートを行います。

customRenderTexture.updateZones = updateZones1;

customRenderTexture.Update();

customRenderTexture.updateZones = updateZones2;

customRenderTexture.Update();

ノート: Unity は、Update() または Initialize() を呼び出すのと同時に、Custom Render Texture の更新または初期化を行いません。これは、Unity が常に次のフレームの開始時に Custom Render Texture を更新し初期化するためです。

ダブルバッファリングしたカスタムテクスチャ

カスタムレンダーテクスチャをダブルバッファリングすることができます。これを行うには、Custom Render Textures コンポーネントDouble Buffered を有効にするか、CustomRenderTexture.doubleBuffered を使用します。

ダブルバッファリングとは、1 つのカスタムレンダーテクスチャの中に 2 つのテクスチャがあり、それぞれが更新されるたびに Unity が交換することを意味します。これにより、カスタムレンダーテクスチャに新しい結果を書き込みながら、最後の更新の結果を読み取ることができます。

ダブルバッファリングは、シェーダーが Unity がすでにテクスチャに書き込んだコンテンツを使用する必要があるが、古典的なブレンドモードで値を混ぜることができない場合に特に有効です。また、シェーダーが直前の結果から異なるピクセルをサンプリングする場合にも必要です。

パフォーマンスに関する注意: ダブルバッファリングは現在、各スワップでテクスチャのコピーを使用するため、実行される頻度とテクスチャの解像度に応じてパフォーマンスが低下する可能性があります。

カスタムレンダーテクスチャの連鎖

カスタムレンダーテクスチャをチェーンすることができます。これを行うには、カスタムレンダーテクスチャを別の Custom Render Textur の Material または Initialization Mode > Texture に割り当てたマテリアルへの入力として使用します。

チェーンにしたカスタムレンダーテクスチャーを使用して、複数のステップでシミュレーションを生成することができます。

シェーンにしたカスタムレンダーテクスチャは互いに依存しています。Unity はこの依存関係を自動的に計算し、各アップデートが正しい順序で行われます。これは、Custom Render Textures Inspector ウィンドウの MaterialInitialization Mode > Texture プロパティに割り当てられているマテリアルを見て行われます。

カスタムレンダーテクスチャのシェーダーの作成

カスタムレンダーテクスチャを手動で更新するには、専用のカスタムレンダーテクスチャシェーダーを記述します。

カスタムレンダーテクスチャシェーダーを書くのに役立つように、ユーティリティ関数とビルトインのヘルパー変数を含む 2 つのサンプルフレームワークを紹介します。

以下のシェーダーの例では、色を掛け合わせた色でテクスチャを塗りつぶします。カスタムレンダーテクスチャのシェーダーを書くときは、以下を行う必要があります。

  • #include "UnityCustomRenderTexture.cginc"
  • 与えられた頂点シェーダー CustomRenderTextureVertexShader を使用
  • ピクセルシェーダーに与えられた入力構造体 v2f_customrendertexture を使用
Shader "CustomRenderTexture/Simple"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _Tex("InputTex", 2D) = "white" {}
     }

     SubShader
     {
        Lighting Off
        Blend One Zero

        Pass
        {
            CGPROGRAM
            #include "UnityCustomRenderTexture.cginc"
            #pragma vertex CustomRenderTextureVertexShader
            #pragma fragment frag
            #pragma target 3.0

            float4      _Color;
            sampler2D   _Tex;

            float4 frag(v2f_customrendertexture IN) : COLOR
            {
                return _Color * tex2D(_Tex, IN.localTexcoord.xy);
            }
            ENDCG
            }
    }
}

以下の例は、カスタムレンダーテクスチャの初期化に使用できるマテリアル用のシェーダーです。マテリアル初期化のシェーダーを書くときは、以下の手順が必須です。

  • #include "UnityCustomRenderTexture.cginc"

  • 与えられた頂点シェーダー CustomRenderTextureVertexShader を使用

  • ピクセルシェーダーに与えられた入力構造体 v2f_customrendertexture を使用

Shader "CustomRenderTexture/CustomTextureInit"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _Tex("InputTex", 2D) = "white" {}
    }

    SubShader
    {
        Lighting Off
        Blend One Zero

        Pass
        {
            CGPROGRAM
            #include "UnityCustomRenderTexture.cginc"

            #pragma vertex InitCustomRenderTextureVertexShader
            #pragma fragment frag
            #pragma target 3.0

            float4      _Color;
            sampler2D   _Tex;

            float4 frag(v2f_init_customrendertexture IN) : COLOR
            {
                return _Color * tex2D(_Tex, IN.texcoord.xy);
            }
            ENDCG
        }
    }
}

#include "UnityCustomRenderTexture.cginc" は、ビルトインの値の群にアクセスできます。これには、Global 値、v2f_customrendertexture 構造体からの値、v2f_init_customrendertexture 構造体からの値が含まれます。

v2f_customrendertexture 構造体は、以下の入力を受け付けます。

名前 タイプ
localTexcoord float3 現在処理中の更新ゾーンと関連するテクスチャ座標
globalTexcoord float3 カスタムレンダーテクスチャそのものに関連するテクスチャ座標
primitiveID uint 現在プロセス中の更新ゾーンのインデックス
direction float3 キューブカスタムレンダーテクスチャ用の、キューブマップ内の現在のピクセル方向

v2f_init_customrendertexture 構造体は、以下の入力を受け付けます。

名前 タイプ
texcoord float3 カスタムレンダーテクスチャそのものに関連するテクスチャ座標

以下の構造体は Global 値です。

名前 タイプ
_CustomRenderTextureWidth float カスタムテクスチャの幅 (ピクセル)
_CustomRenderTextureHeight float カスタムテクスチャの高さ (ピクセル)
_CustomRenderTextureDepth float カスタムテクスチャの深度 (ピクセル。3D テクスチャ用、3D テクスチャでない場合は常に 1 )。
_CustomRenderTextureCubeFace float Unity が処理する現在のキューブマップの面のインデックス (-X, +X, -Y, +Y, -Z, +Z)。これはキューブマップにのみ適用されます。
_CustomRenderTexture3DSlice float 現在処理している 3D スライスのインデックス。これは、 3D テクスチャにのみ適用されます。
_SelfTexture2D Sampler2D ダブルバッファリングされたテクスチャ用。最後のスワップの前の最後の更新結果を含むテクスチャ
_SelfTextureCube SamplerCUBE ダブルバッファリングされたテクスチャ用。最後のスワップの前の最後の更新結果を含むテクスチャ
_SelfTexture3D Sampler3D ダブルバッファリングされたテクスチャ用。最後のスワップの前の最後の更新結果を含むテクスチャ

  • 2017–05–18 公開ページ

  • Unity 2017.1 で新規NewIn20171

レンダーテクスチャ
ムービーテクスチャ