Custom Render Textures (カスタムレンダーテクスチャ) は特別なタイプのテクスチャで、これを使うとシェーダーでテクスチャを更新することができます。これは、レンダーテクスチャ を拡張したものです。カスタムレンダーテクスチャを使用すると、コースティクス、雨の効果のためのリップルシミュレーション、液体のしぶきなどの複雑なシミュレーションを作成することができます。
カスタムレンダーテクスチャ機能はスクリプトやシェーダーのフレームワークを提供し、更新頻度の変更、部分的更新、マルチパスの更新などのさらに複雑な設定をサポートします。
このフレームワークを使用するには、Custom Render Texture アセットにマテリアルを割り当てる必要があります。Custom Render Texture には、互換性のあるマテリアルが必要です。詳しくは、カスタムレンダーテクスチャのシェーダーの作成 を参照してください。
互換性のあるマテリアルを Custom Render Texture アセットに割り当てるには、以下を行います。
このマテリアルは、パラメーターに応じてテクスチャのコンテンツを更新します。
このページには以下の情報が含まれています。
次の表は、Custom Render Textures 機能と各レンダーパイプラインの互換性について説明します。
| 機能 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタムのスクリプタブルレンダーパイプライン (SRP) | 
|---|---|---|---|---|
| カスタムレンダーテクスチャ | あり (1) | あり (1) | あり (1) | あり (1) | 
ノート:
 
カスタムレンダーテクスチャ の Inspector ウィンドウには、レンダーテクスチャの Inspector ウィンドウと同じプロパティが多数と、Custom Render Textures に固有のプロパティも表示されます。
| プロパティ | 機能 | 
|---|---|
| Dimension | レンダーテクスチャの次元 | 
| 2D | レンダーテクスチャを 2D にします。 | 
| Cube | レンダーテクスチャをキューブマップにします。 | 
| 3D | レンダーテクスチャを 3D にします。 | 
| Size | レンダーテクスチャのサイズ (ピクセル) | 
| Color Format | レンダーテクスチャの色の形式 | 
| sRGB (カラーレンダーテクスチャ) | これを有効にすると、レンダーテクスチャで 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 ファイル (テクスチャ形式による) にエキスポートできます。
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 ウィンドウの Material と Initialization 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
CustomRenderTexture