動的解像度
動的解像度は GPU にかかるワークロードを軽減し、安定したターゲットフレームレートを維持するのに役立ちます。HD レンダーパイプライン (High Definition Render Pipeline、HDRP) は、動的解像度でメインレンダリングパスが使うレンダーターゲットの解像度を低くします。プラットフォームがサポートする場合、HDRP はハードウェアの動的解像度を使いますが、そうでなければソフトウェアバージョンを使います。主な違いは、ハードウェアの動的解像度では、ハードウェアがバックバッファがスケールされたサイズになるまでレンダーターゲットに対応する点です。つまり、レンダーターゲットをより早く消去します。
動的解像度を有効にすると、HDRP はレンダーターゲットができるだけ最大の解像度になるように割り当てます。その後 HDRP はビューポイントを適切にリスケールするので、様々な解像度でレンダリングすることができます。HDRP は各フレームの終わりでスケールされたレンダリングの結果をバックバッファの解像度に合わせます。HDRP が動的解像度をプロセスするためにハードウェアかソフトウェアのどちらを使っても、結果をアップスケールする際はソフトウェアの方を使います。HDRP が使うメソッドは Upscale Filter で定義されます。
動的解像度の使用
プロジェクトで動的解像度を使うには、HDRP アセット で動的解像度を有効にしてから一緒に使いたい カメラ をそれぞれ有効にします。この手順は以下の通りです。
- HDRP アセットの Inspector で、Rendering > Dynamic Resolution に行き、Enable チェックボックスを有効にします。その他の HDRP アセットのグローバル動的解像度プロパティーのカスタマイズに関する情報は、HDRP アセットドキュメント の動的解像度セクションを参照してください。
- 各 カメラ に動的解像度を適用したい場合は、General セクションに行き Allow Dynamic Resolution を有効にします。
動的解像度は自動機能ではありませんので、手動で DynamicResolutionHandler.SetDynamicResScaler(PerformDynamicRes scaler, DynamicResScalePolicyType scalerType)
関数を呼び出す必要があります。
ポリシータイプは以下のうちの 1 つになります。
DynamicResScalePolicyType.ReturnsPercentage
: DynamicResolutionHandler はscaler
が画面比率値を返すものとします。値は HDRP アセットで設定された最小値と最大値の間に固定されます。DynamicResScalePolicyType.ReturnsMinMaxLerpFactor
: DynamicResolutionHandler はScaler
が範囲が [0 ... 1] で HDRP アセットで設定された最小値と最大値の間の lerp 因子として使われるt
因子を返すものとします。
下の例では、この関数の呼び出し方を示します。実際の制作環境では、アプリケーションのパフォーマンスに応じてこの関数を呼び出してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class DynamicRes : MonoBehaviour
{
public float secondsToNextChange = 1.0f;
public float fractionDeltaStep = 0.1f;
private float currentScale = 1.0f;
private float directionOfChange = -1.0f;
private float elapsedTimeSinceChange = 0.0f;
// 解像度の毎秒を ToNextChange 秒に拡大縮小するポリシーの簡単な例。
// この呼び出しは DynamicResScalePolicyType.ReturnsMinMaxLerpFactor を使うため、HDRP は次のコンテクストで currentScale を使う:
// finalScreenPercentage = Mathf.Lerp(minScreenPercentage, maxScreenPercentage, currentScale);
public float SetDynamicResolutionScale()
{
elapsedTimeSinceChange += Time.deltaTime;
// 数秒 ToNextChange 秒待ってから解像度の変更をリクエストする。
if (elapsedTimeSinceChange >= secondsToNextChange)
{
currentScale += directionOfChange * fractionDeltaStep;
// currenScale が最小または最大解像度に達すると、解像度変更の方向を切り替える。
if (currentScale <= 0.0f || currentScale >= 1.0f)
{
directionOfChange *= -1.0f;
}
。elapsedTimeSinceChange = 0.0f;
}
return currentScale;
}
void Start()
{
// 上述の動的解像度ポリシーを関連付ける。
DynamicResolutionHandler.SetDynamicResScaler(SetDynamicResolutionScale, DynamicResScalePolicyType.ReturnsMinMaxLerpFactor);
}
}