다이내믹 해상도
다이내믹 해상도는 GPU에 작업 부하를 감소하여 안정적인 타켓 프레임 속도를 유지하는 데 도움이 됩니다. 고해상도 렌더 파이프라인(HDRP)은 다이내믹 해상도를 사용하여 메인 렌더링 패스가 사용하는 렌더 타겟의 해상도를 낮춥니다. 이렇게 하기 위해 HDRP는 플랫폼이 지원하는 경우 하드웨어 다이내믹 해상도를 사용하며 그렇지 않으면 소프트웨어 버전을 사용합니다. 주요한 차이는 하드웨어 다이내믹 해상도의 경우 백 버퍼의 크기가 조정될 때까지 하드웨어가 렌더 타겟을 처리한다는 것입니다. 즉 하드웨어 다이내믹 해상도는 렌더 타겟을 더 빨리 지웁니다.
다이내믹 해상도를 활성화하면 HDRP는 가능한 최대 해상도를 수용하도록 렌더 타겟을 할당합니다. 그런 다음 HDRP는 그에 맞춰 뷰포트를 다시 확대/축소하여 다양한 해상도로 렌더링할 수 있습니다. 각 프레임의 끝에서 HDRP는 백 버퍼 해상도에 맞도록 크기가 조정된 렌더링 결과를 업스케일링합니다. HDRP가 하드웨어나 소프트웨어로 다이내믹 해상도를 처리하는 데 사용하는 방법과 상관없이 결과를 업스케일링하는 데는 계속 소프트웨어 방법을 사용합니다. HDRP가 사용하는 방법은 Upscale Filter에 정의되어 있습니다.
다이내믹 해상도 사용
프로젝트에 다이내믹 해상도를 사용하려면 반드시 HDRP 에셋에서 다이내믹 해상도를 활성화한 다음 사용하려는 각 카메라에 대해 다이내믹 해상도를 활성화해야 합니다. 이렇게 하려면 다음 단계를 따르십시오.
- HDRP 에셋의 인스펙터에서 Rendering > Dynamic Resolution으로 이동하여 Enable 체크박스를 활성화합니다. HDRP 에셋의 나머지 전역 다이내믹 해상도 프로퍼티를 커스터마이즈하는 방법에 대한 자세한 내용은 HDRP 에셋 문서의 다이내믹 해상도 섹션을 참조하십시오.
- 다이내믹 해상도를 수행하고자 하는 모든 카메라에 대해서는 General 섹션으로 이동하고 Allow Dynamic Resolution을 활성화합니다.
다이내믹 해상도는 자동이 아니므로 수동으로 DynamicResolutionHandler.SetDynamicResScaler(PerformDynamicRes scaler, DynamicResScalePolicyType scalerType)
함수를 호출해야 합니다.
정책 타입은 다음 중 하나일 수 있습니다.
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;
// Simple example of a policy that scales the resolution every secondsToNextChange seconds.
// Since this call uses DynamicResScalePolicyType.ReturnsMinMaxLerpFactor, HDRP uses currentScale in the following context:
// finalScreenPercentage = Mathf.Lerp(minScreenPercentage, maxScreenPercentage, currentScale);
public float SetDynamicResolutionScale()
{
elapsedTimeSinceChange += Time.deltaTime;
// Waits for secondsToNextChange seconds then requests a change of resolution.
if (elapsedTimeSinceChange >= secondsToNextChange)
{
currentScale += directionOfChange * fractionDeltaStep;
// When currenScale reaches the minimum or maximum resolution, this switches the direction of resolution change.
if (currentScale <= 0.0f || currentScale >= 1.0f)
{
directionOfChange *= -1.0f;
}
elapsedTimeSinceChange = 0.0f;
}
return currentScale;
}
void Start()
{
// Binds the dynamic resolution policy defined above.
DynamicResolutionHandler.SetDynamicResScaler(SetDynamicResolutionScale, DynamicResScalePolicyType.ReturnsMinMaxLerpFactor);
}
}