Frame Settings Scripting API
HD レンダーパイプライン (High Definition Render Pipeline、HDRP) において、フレーム設定 は、カメラ、リフレクションプローブ、または 平面リフレクションプローブ などのレンダリングコンポーネントがどのようにシーンをレンダリングするかを制御します。プロジェクト全体にデフォルトフレーム設定を特定してから、ある特定のレンダリングコンポーネントに対してオーバーライドすることが可能です。つまり、各フレーム設定には HDRP アセット で設定されているデフォルト値があり、シーンの個々のレンダリングコンポーネントはそれをオーバーライドできるということです。これはあるエフェクトを使う必要のない、優先順位の低いレンダリングコンポーネントがある場合に、便利です。レンダリングコンポーネントがオーバーライドするデフォルトフレーム設定を特定するために、各レンダリングコンポーネントには オーバーライドマスク が含まれています。マスクはビットの配列で、ビットはそれぞれ 2 種類のステートの 1 つを表します (0 は無効、1 は有効)。オーバーライドマスクの各ビットは、特定のフレーム設定のオーバーライドステートを表します。
特定のレンダリングコンポーネントにフレーム設定の最終値を取得するために、HDRP は以下のステップを実行します。
- フレーム設定に対するプロジェクト全体のデフォルト値を確認します。このステップでは、HDRP は HDRP アセットのフレーム設定に格納された既存値を確認します。
- レンダリングコンポーネントのオーバーライドマスクを確認し、フレーム設定に相当するビットが設定されているかを確かめます。オーバーライドマスクのフレーム設定のビットのステートは、レンダリングコンポーネントのインスペクターにあるフレーム設定の左側のオーバーライドチェックボックスのステートと一致します。
- レンダリングコンポーネントのカスタムフレーム設定から、フレーム設定のオーバーライド値を取得します。
- 結果をサニタイズします。HDRP アセットで使う機能を特定し、プロジェクトを軽くすることができます。変更したいフレーム設定が利用できない機能に影響を及ぼす場合は、Unity はこの最終削除パスで破棄します。利用不可能な機能を HDRP がプロセスしないようにするため、スクリプティング API を介してサニタイズ処理にアクセスすることはできません。
デフォルトフレーム設定の変更
デフォルトフレーム設定は HDRP アセットにあるため、ランタイムに変更することは推奨できません。代わりに、デフォルト設定タブ の Edit モードで変更してください。
デフォルトフレーム設定はそれぞれ、3 つのレンダリングコンポーネントのタイプに設定できます。
- カメラ
- リアルタイムリフレクションプローブおよびリアルタイム平面リフレクションプローブ
- ベイクした/カスタムリフレクションプローブおよびベイクした/カスタム平面リフレクションプローブ
現在デフォルトフレーム設定を変更するスクリプティング API はありません。
特定のレンダリングコンポーネントに対するフレーム設定の変更
HDRP はレンダリングコンポーネントに付随する追加データコンポーネントに、レンダリングコンポーネント用のフレーム設定を格納しています。追加データコンポーネントは以下の通りです。
レンダリングコンポーネント | 追加データコンポーネント |
---|---|
Camera | HDAdditionalCameraData |
Reflection Probe | HDAdditionalReflectionData |
フレーム設定の値を変更するには、まず最初に追加データコンポーネントへの参照を取得します。このためにはパブリックの変数を作成してインスペクターで割り当てるか、または T が追加データコンポーネントタイプである GetComponent
次に、フレーム設定オーバーライドマスクにアクセスします。これはどのフレーム設定にオーバーライドされた値を使うかを制御する、 FrameSettingsOverrideMask
のタイプです。フレーム設定オーバーライドマスクへのアクセスは、カメラのフレーム設定を変更したいか、またはリフレクションプローブを変更したいかによって異なります。
- カメラ:
HDAdditionalCameraData.renderingPathCustomFrameSettingsOverrideMask
- リフレクションプローブ:
HDAdditionalReflectionData.frameSettingsOverrideMask
マスクでビットを設定/設定解除する方法を含む、FrameSettingsOverrideMask
に利用可能な API に関する情報は、FrameSettingsOverrideMask スクリプティング API を参照してください。
最後に、フレーム設定構造自体にアクセスします。これは各フレーム設定に対する実際の値を制御する、 FrameSettings
のタイプです。フレーム設定へのアクセスは、カメラのフレーム設定を変更したいか、またはリフレクションプローブを変更したいかによって異なります。
- カメラ:
HDAdditionalCameraData.renderingPathCustomFrameSettings
- リフレクションプローブ:
HDAdditionalReflectionData.frameSettings
フレーム設定値の編集方法を含む、FrameSettings
に利用可能な API に関する情報は、フレーム設定スクリプティング API を参照してください。
フレーム設定エニュメレーター
フレーム設定の値をより簡単に設定するために、HDRP は次の enum タイプを提供します。
LitShaderMode
レンダリングコンポーネントをディファ―ドとフォワードレンダリング間で切り替えるための enum です。
各 enum 値に関する情報は、LitShaderMode を参照してください。
LODBiasMode
HDRP がどのように LOD バイアスを計算するかを定義する enum です。
各 enum 値に関する情報は、 LODBiasMode を参照してください。
MaximumLODLevelMode
HDRP がどのように最大 LOD レベルを計算するかを定義する enum です。
各 enum 値に関する情報は、 MaximumLODLevelMode を参照してください。
FrameSettingsField
各エントリーが特定のフレーム設定を表現する enum です。この enum のエントリーリストは、FrameSettingsField を参照してください。
各フレーム設定に対するエントリーと同様、この enum もまた、便宜上および内部使用の目的で、-1 に設定されている FrameSettingsField.None
値を含みます。
FrameSettingsOverrideMask Scripting API
これはオーバーライドマスクを格納する単一フィールドを持つ構造体です。この構造体および含まれる API に関する情報は、FrameSettingsOverrideMask を参照してください。
オーバーライドマスクで指定された Frame Setting に対するビットに簡単にアクセスできるよう、HDRP は FrameSettingsField enum を提供します。これは例えば、Opaque Objects のフレーム設定をオーバーライドするビットを見つけるときに、使うことができます。この場合、this[(int)FrameSettingsField.OpaqueObjects]
を実行します。
次の例では、レンダリングコンポーネントのオーバーライドマスクからの humanizedData
と、レンダリングコンポーネントのカスタムフレーム設定を比較する方法を示しています。これらはカスタムフレーム設定ですがマスクはすべてゼロで、つまりこのレンダリングコンポーネントがデフォルトフレーム設定を使うことを意味します。
FrameSettings Scripting API
これはレンダリングコンポーネントがどのようにシーンをレンダリングするかに関する情報を含む構造体です。この構造体および含まれる API に関する情報は、フレーム設定 を参照してください。
例
次の例では、カメラが不透明ゲームオブジェクトをレンダリングしないようにカメラのフレーム設定を変更する、コンポーネントを実演します。カメラがフレーム設定を変更するという意味のパブリックフィールド、cameraToChange
と、カメラのフレーム設定を変更するロジックを含むパブリック関数RemoveOpaqueObjectsFromRendering
を持ちます。
using UnityEngine;
using UnityEngine.Rendering.HighDefinition;
public class ChangeFrameSettings : MonoBehaviour
{
public Camera cameraToChange;
public void RemoveOpaqueObjectsFromRendering()
{
HDAdditionalCameraData hdCameraData = cameraToChange.GetComponent<HDAdditionalCameraData>();
hdCameraData.renderingPathCustomFrameSettingsOverrideMask.mask[(int)FrameSettingsField.OpaqueObjects] = true;
hdCameraData.renderingPathCustomFrameSettings.SetEnabled(FrameSettingsField.OpaqueObjects, false);
}
}