カスタムレンダーテクスチャはレンダーテクスチャの拡張機能で、これを使うと簡単にシェーダー付きのテクスチャを作成できます。これは、コースティクス、雨の効果に使われるリップルシミュレーション、壁面へぶちまけられた液体など、あらゆる種類の複雑なシミュレーションを実装するのに便利です。また、カスタムレンダーテクスチャはスクリプトやシェーダーのフレームワークを提供し、部分的更新、または、マルチパスの更新、更新頻度の変更などのさらに複雑な設定をサポートします。
それらを使用するには、新し い Custom Render Texture アセットを作成し、それにマテリアルを割り当てる必要があります。 このマテリアルは、さまざまなパラメーターに従ってテクスチャの内容を更新します。カスタムレンダーテクスチャは、他のカスタムレンダーテクスチャに使用されているものであっても、通常のテクスチャのようにあらゆる種類のマテリアルに割り当てることができます。
Custom Render Texture のインスペクターは、多くの独自のプロパティー同様、Render Texture のほとんどのプロパティーを表示します。
プロパティー | 機能 |
---|---|
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 変形で伸長される際に、テクスチャをどのようにフィルタリングするかを選択します。 |
Point | 拡大したテクスチャをブロック状にします。 |
Bilinear | 拡大したテクスチャをぼかします。 |
Trilinear | Bilinear に似ていますが、テクスチャを異なるミップレベル間でもぼかします。 |
Aniso Level | 急角度から見たときのテスクチャの品質を向上します。床や地面のテクスチャに適しています。 |
Custom Texture のパラメーターは 3 つの主なカテゴリーに分かれています。
Material: テクスチャを更新するのにどのシェーダーを使用するかを決定します。
Initialization: シェーダーが更新を行う前に、どのようにテクスチャを初期化するかを操作します。
Update: シェーダーがどのようにテクスチャを更新するかを制御します。
プロパティー | 機能 |
---|---|
Material | カスタムレンダーテクスチャを更新するために使用されるマテリアル |
Shader Pass | カスタムテクスチャを更新するために使用するシェーダーパス。マテリアルに使用できるすべてのパスがドロップダウンに表示されます。 |
Initialization Mode | どのようにテクスチャを初期化するかを指定します。 |
OnLoad | テクスチャは作成するごとに 1 回初期化されます。 |
Realtime | テクスチャはフレームごとに初期化されます。 |
OnDemand | テクスチャはスクリプトから要求に応じて初期化されます。 |
Source | どのようにテクスチャを初期化するかを指定します。 |
Texture and Color | テクスチャは、テクスチャとカラーの積によって初期化されます。 |
Initialization Color | カスタムテクスチャが初期化されるカラー。初期化テクスチャも提供されている場合は、カスタムテクスチャはカラーとテクスチャの積によって初期化されます。 |
Initialization Color | カスタムテクスチャが初期化されるカラー。初期化テクスチャも提供されている場合は、カスタムテクスチャはカラーとテクスチャの積によって初期化されます。 |
Material | テクスチャは、マテリアルによって初期化されます。 |
Initialization Material | カスタムテクスチャを初期化するときに使用するマテリアル |
Update Mode | シェーダーがどのようにテクスチャを初期化するかを指定します。 |
OnLoad | テクスチャは作成するごとに 1 回更新されます。 |
Realtime | テクスチャはフレームごとに初期化されます。 |
OnDemand | テクスチャはスクリプトから要求に応じて初期化されます。 |
Period | (リアルタイムのみ) リアルタイムテクスチャが更新される秒周期 (0.0 の場合は、すべてのフレームで更新) |
Double Buffered | テクスチャはダブルバッファリングされます。各更新は、2 つのバッファを入れ替えて行われ、ユーザーはシェーダー内の以前の結果を読み取ることができます。 |
Wrap Update Zones | 部分的な更新ゾーンがテクスチャの境界線の周りを包むようにできます。 |
Cubemap Faces | (キューブマップのみ) 一連の切り替えによって、ユーザーはキューブマップの各表面の更新を有効/無効にすることができます。 |
Update Zone Space | 更新ゾーンを決定する座標系 |
Normalized | (0, 0) の左上の角から始まり、座標とサイズは 0 と 1 の間。 |
Pixel | すべての座標とサイズはピクセルで表示され、テクスチャの幅と高さに制限されます。(0, 0) の左上の角から始まります。 |
Update Zone List | テクスチャのアップデートゾーンのリスト (詳細は後述を参照) |
カスタムレンダーテクスチャは、コンテキストメニューの “Export” で PNG や EXR ファイル (テクスチャ形式による) にエキスポートできます。
デフォルトでは、カスタムレンダーテクスチャが更新されると、マテリアルによってテクスチャ全体が一度に更新されます。カスタムテクスチャの重要な機能の 1 つは、ユーザーが部分的に更新するゾーンを定義できる機能です。これにより、ユーザーは必要なだけゾーンと、ゾーンを処理する順序を定義できます。
これは、いくつかの異なる目的のために使用することができます。 たとえば、テクスチャ上に複数の小さなゾーンを作りテクスチャに水滴を飛び散らせ、それから、リップルをシミュレーションするためにフルパスを実行します。テクスチャ全体を更新する必要がないことがわかっているときに、これを最適化の 1 つとして使用することもできます。
Update Zones にはそれ自体の一群のプロパティーがあります。更新ゾーンの空間 は画面に反映されます。テクスチャの __次元 __ によって、座標は 2D (2D テクスチャとキューブテクスチャ用) か 3D (3D テクスチャ用) になります。
プロパティー | 機能 |
---|---|
Center | 更新ゾーンの中心座標 |
Size | 更新ゾーンのサイズ |
Rotation | 更新ゾーンの方向の角度表示 ( 3D テクスチャには利用できません)。 |
Shader Pass | 更新ゾーンに使用するシェーダーパス。デフォルトのままにすると、更新ゾーンはインスペクターのメイン部分で定義されたシェーダーパスを使用します。そうでない場合は、指定したものを使用します。 |
Swap (Double Buffer) | (ダブルバッファリングしたテクスチャのみ) これを true にすると、更新ゾーンを処理する前にバッファは交換されます。 |
カスタムレンダーテクスチャは「ダブルバッファリング」することができます。内部的には 2 つのテクスチャがありますが、ユーザーの観点からは同じです。各更新の後、2 つのテクスチャが入れ替えられます。これにより、ユーザーはカスタムレンダーテクスチャに新しい結果を書き込みながら、前の更新の結果を読み込むことができます。これは、シェーダが既にテクスチャに書き込まれたコンテンツを使用する必要があるが、その値を従来のブレンドモードと混在させることができない場合に特に便利です。これは、シェーダが前の結果の異なるピクセルをサンプリングする必要がある場合にも必要です。
パフォーマンスの警告 いくつかの技術的な理由から、ダブルバッファリングは現在、各スワップでテクスチャのコピーを使用するため、実行される頻度とテクスチャの解像度に応じてパフォーマンスが低下する可能性があります。
カスタムレンダーテクスチャには、更新するマテリアルが必要です。このマテリアルは、テクスチャを入力として持つことができます。つまり、カスタムテクスチャを別のテクスチャを生成するための入力として使用できます。このようにすると、ユーザーは複数のカスタムテクスチャを連鎖させて、より複雑な複数ステップがあるシミュレーションを生成することができます。システムはすべての依存関係を正しく処理ます。そのため、さまざまな更新が正しい順序で行われます。
カスタムテクスチャの更新は、レンダーテクスチャの 2D ポストプロセスを行うようなものです。ユーザーがカスタムテクスチャシェーダーを作成するのを助けるために、Unity はユーティリティ関数を伴う小さなフレームワークとビルトインヘルパー変数を提供します。
ここに、カラーとカラーを乗じてテクスチャを塗りつぶす本当に簡単な例があります。
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 を使用
上記以外は、ユーザーの思い通りにピクセルシェーダーを作成できます。
初期化マテリアルで使用されるシェーダーのもう 1 つの例があります。
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
{
_Color * tex2D(_Tex, IN.texcoord.xy);
}
ENDCG
}
}
}
更新シェーダーと同じように、以下のステップだけが必須です。
* #include “UnityCustomRenderTexture.cginc”
与えられた頂点シェーダー InitCustomRenderTextureVertexShader を使用
ピクセルシェーダーに与えられた入力構造体 v2f_init_customrendertexture を使用
この処理でユーザーを援助するために、Unity は一群のビルトイン値を提供します。
v2f_customrendertexture 構造体の入力値
Name | 型 | 値 |
---|---|---|
localTexcoord |
float3 |
現在処理中の更新ゾーンと関連するテクスチャ座標 |
globalTexcoord |
float3 |
カスタムレンダーテクスチャそのものに関連するテクスチャ座標 |
primitiveID |
uint |
現在プロセス中の更新ゾーンのインデックス |
direction |
float3 |
キューブカスタムレンダーテクスチャ用の、キューブマップ内の現在のピクセル方向 |
v2f_customrendertexture 構造体の入力値
Name | 型 | 値 |
---|---|---|
texcoord |
float3 | カスタムレンダーテクスチャそのものに関連するテクスチャ座標 |
グローバル値
Name | 型 | 値 |
---|---|---|
_CustomRenderTextureWidth |
float |
カスタムテクスチャの幅 (ピクセル) |
_CustomRenderTextureHeight |
float |
カスタムテクスチャの高さ (ピクセル) |
_CustomRenderTextureDepth |
float |
カスタムテクスチャの深度 (ピクセル。3D テクスチャ用、3D テクスチャでない場合は常に 1 )。 |
_CustomRenderTextureCubeFace |
float |
キューブマップ用。現在処理しているキューブマップ面のインデックス (-X, +X, -Y, +Y, -Z, +Z)。 |
_CustomRenderTexture3DSlice |
float |
3D テクスチャ用。現在処理している 3D スライスのインデックス |
_SelfTexture2D |
Sampler2D |
ダブルバッファリングされたテクスチャ用。最後のスワップの前の最後の更新結果を含むテクスチャ |
_SelfTextureCube |
SamplerCUBE |
ダブルバッファリングされたテクスチャ用。最後のスワップの前の最後の更新結果を含むテクスチャ |
_SelfTexture3D |
Sampler3D |
ダブルバッファリングされたテクスチャ用。最後のスワップの前の最後の更新結果を含むテクスチャ |
ここで説明するほとんどの機能には、Scripting API を通してアクセスできます。マテリアルパラメーターの変更、更新頻度、ゾーンの更新、更新要求などは、すべてスクリプトで行うことができます。
ただし、カスタムテクスチャに対する更新リクエストは、カスタムテクスチャの現在の状態で、フレームの最初の非常に特定な時間に発生します。これにより、このテクスチャを使用するすべてのマテリアルが最新の状態であることが保証されます。
以下のようなパターンがあります。
customRenderTexture.updateZones = updateZones1;
customRenderTexture.Update();
customRenderTexture.updateZones = updateZones2;
customRenderTexture.Update();
上記のようなパターンは、更新ゾーンの最初の配列で行われた 1 つの更新の「期待された」結果をもたらさず、それから、もう 1 つの配列によ る 2 つ目の更新。これは、2 番目の配列で 2 つの更新を行います。
非常に良いことには、変更されたプロパティーはすべて、次のフレームでアクティブになるということです。