Blendable は、他のブレンド可能なもの (blendable) とスムーズに補間 (ブレンド) できるプロパティを持つアセットです。Blendable は多くの場合、PostProcessMaterial に使用されていましたが、このシステムはビューに依存 (通常はカメラ位置に依存) するものであれば何にでも使用可能です。
Blendable
Blendables はこれまでもエンジン内にありましたが、PostprocessMaterils / PostprocessMaterialInstances に対してのみ使用されていました。しかし、そのコンセプトはより一般的な用途を対象にしたもので、任意のデータ (線形値やカラーが最適です) を何らかの最終データにブレンドすることができるものです。任意のサブシステムでビュー内のデータをピックアップしてレンダリングに影響を及ぼすことができます。データはビューごとにブレンドされるため、分割画面ではビューごとに異なる設定をブレンドすることができます (ポスト プロセスに影響を及ぼすヒット インジケータなど)。
Blendable は、IBlendableInterface を持つオブジェクトです。現在、次のアセット タイプによって実装されています。
- PostprocessMaterials
- PostprocessMaterialInstances
- LightPropagationVolumeBlendable (下記参照)
Blendables コンテナは、次のオブジェクトに組み込まれている PostProcessSettings 内にあります。
- PostProcessVolume
- PostProcessComponent
- SceneCaptureActor
- CameraComponent
LightPropagationVolumeBlendable アセットは、新しい Blendable を作成する方法と既存の PostProcessSettings を置き換える方法を示すために作成されました。既存のシステムが小さい場合はうまく機能しますが、設定が大量になると、より高度なシステムが必要になることがわかりました。

Blendable アセットは、コンテンツ ブラウザの Blendable カテゴリに表示されます。[Add New (新規追加)] を使用するか、このカテゴリでアセットをフィルタリングできます。
新しいシステムの利点は次のとおりです。
- エンジンの変更による拡張や維持が簡単になりました (1 つの中心的な構造体を変更する必要がなく、独自のモジュール内に含めることが可能です)
- パッケージへの間接参照により、レベルへのアクセス (バージョン管理) なしにコンテンツを調整することができます
- 間接参照とは、1 つのアセットをいくつものケースで再利用できることを意味します (冗長性が減り、より強力になります)
- 各 Blendable 用の UI をカスタマイズ可能です (これを単一の構造体で行うのはかなり困難です)
- 各 Blendable の参照には独自のウェイトを設定することができます。アセットにもウェイトを設定することができ (「LightPropagationVolumeBlendable」を参照)、プロパティごとのウェイトも簡単に設定することができます。
- 大きな構造体を分割することにより、ブループリントとのインタラクションがより効率的かつシンプルになります。
Blendable コンテナ
コンテナは、ウェイトの配列と Blendable インターフェースの参照として実装されます。
PostProcessVolume 設定を開いて Blendable の配列を見ると、Blendable アセットへの参照を持つウェイトの配列が確認できます。ウェイトは通常、0..1 の範囲にあり、その参照先はパッケージ内に存在するアセット (コンテンツ ブラウザで作成されたもの) か、Blendable の配列を含むオブジェクト内に存在するものになります。

Blendable コンテナはポスト プロセスの設定にあります (この図ではポストプロセス ボリュームにあります)。この図の配列には LightPropagationVolumeBlendable (ボリューム オブジェクト内に存在)、未使用の配列要素、「LPV0」という名前のアセット (パッケージ内に存在) への参照の 3 つの要素があります。どちらの Blendable もウェイトは 1.0 です。
配列で新規要素を作成する場合、特定のタイプの Blendable を作成するか、アセット参照を使用するかを選択できます (マテリアル、マテリアル インスタンスなど)。将来的には、さらに多くの Blendable タイプ (Bloom、SceneColor、DepthOfField など) を作成する予定です。参照は、 Blendable (IBlendableInterface を実装) であればどのタイプでも可能です。配列内の順序は、レイヤーのスタック順序とは逆になります。これは、ブレンドが上から下に向かって適用され、 そこに存在していたデータが上書きされるためです。たくさんのボリューム (またはその他のオブジェクト) のデータは、ウェイトと優先度が考慮されて結合されることに注意してください。
注:「global」という名前のレベルで、優先度の低いバインドされていない PostProcessVolume を使用することをお勧めします。既存のレベルを十分に制御するには、 優先度の高いバインドされていないボリュームを追加します。Blendable の効果の有無をチェックするには、ウェイトを 0 にしたり戻したりして確認します。
パッケージ内にオブジェクト (ボリュームなど) の一部として存在する、またはブループリント内で動的に作成される Blendable
どちらの Blendable も選択可能ですが、後でバージョン管理の競合を最小限に抑えて一括管理が簡単に行えるため、パッケージ (パッケージ内の指定されたアセットを参照) をお勧めします。 最大限にプログラミングしやすくするために、ブループリントで Blendable を作成することも可能です。ブループリントはプログラミングの一形態であるため、UI で設定を行ったり、コードで ハード コーディングするのに似ています。コードを使う方法はより複雑で、他の人が設定を微調整することが難しくなります。

LightPropagationVolumeBlendable の詳細はエディタに表示されます。Blendable がコンテンツ ブラウザで作成されている場合も (左側)、オブジェクト内 (ポスト プロセス ボリュームなど) で作成されている場合も、ユーザー インターフェースは似たものになります。各プロパティにチェックボックス (weight=0 または weight=1) を用意して構造体全体にブレンドのウェイトを与えることをお勧めします。
独自の Blendable を作成する方法 (C++)
現時点では、LightPropagationVolumeBlendable プラグインをコピーすることをお勧めします。アセットの作成後は、ライト プロパゲーション システムと同じ方法でブレンドされたデータをピックアップできます。 ブレンド後に、GetSingleFinalDataConst() メソッドを使用してデータを取得します。最高のパフォーマンスを得るには、不必要に (頻繁に) この関数を呼び出さないようにすることをお勧めします。
ブループリント
AddOrUpdateBlendable ブループリント関数は、PostProcessSettings のある場所で公開されています。これにより、Blendable コンテナに簡単にアクセスできるようになります。Blendable コンテナ、ウェイト、Blendable への参照を持つオブジェクトを 渡します。すでにコンテナ内に参照が存在する場合は、ウェイトを更新するだけです。コンテナ要素は削除されません。 これは、コンテナを移動する他のコードを混乱させ、ガベージ コレクションに影響を与える可能性があるためです。ウェイトが 0 の Blendable 参照ではパフォーマンス コストが発生しないため、要素を取り除く必要は まったくありません。
次に、コンテンツ ブラウザで Blendable アセットを参照する方法を示します。

LightPropagationVolumeBlendable (Object Reference) タイプの変数「BlendableVar」を使用して、「LPV0」という名前の LightPropagationVolumeBlendable アセットを参照します。
ConstructObjectFromClass ブループリント関数を使用して、ブループリントに新規 Blendable を作成することができます。新規オブジェクトの Outer を Blendable コンテナを持つオブジェクトに設定することにより、 UI でオブジェクトを作成 (Blendable をオブジェクトの一部として作成) した場合と同じ動作になります。

ここでは、LightpropagationVolumeBlendable タイプのオブジェクトを作成し、設定を取得して、一部のメンバーを SetMembersIn... 関数を使用して設定します。
現時点では、オーバーライド フラグを手動で true (チェックボックスをオン) にする必要があります。true にしない場合は、同じ名前のプロパティがピックアップされません。
今後の計画
- AddOrUpdateBlendable 関数をブラウズする際に、状況に応じた機能はまだ動作しません (回避策:[Context Sensitive (状況依存)] チェックボックスを無効にします)。
- すべての PostprocessSettings を LightPropagationVolumeBlendable などのオブジェクトに分割し、いずれ PostProcessSettings を削除する予定です。古いレベルはロード時に データの損失なく変換することができます。コンテンツ パッケージに大量のアセットがスパムされるのを防ぐため、オブジェクトをレベルの一部として作成します。
- ブループリントをより使いやすくするため、さらに改善します。
- ワールド設定とプロジェクト設定で簡単に Blendable 配列を公開できるようにします。
- どの Blendable が適用されているかをわかりやすくするため、ウェイト、アセットやオブジェクトの名前とタイプを表示するデバッグ ビューを用意します。