애플리케이션을 성능이 다른 하드웨어에서 실행할 때 빌트인 렌더 파이프라인에서 그래픽스 티어를 사용하여 그래픽스 설정을 다르게 적용할 수 있습니다. Unity의 빌트인 티어 설정을 사용하여 일반 설정을 정하거나 자체 셰이더 코드 또는 C# 코드에 커스텀 동작을 정의할 수 있습니다.
참고:이 기능은 빌트인 렌더 파이프라인에서만 지원됩니다.다른 렌더 파이프라인에서 Unity는 시작 시 하드웨어를 계속 검사하고 Graphics.activeTier에 해당 값을 저장합니다. 하지만 이 필드의 값은 아무런 영향을 미치지 않으며 Unity는 그래픽스 티어와 관련된 다른 작업을 수행하지 않습니다.
Unity가 처음으로 애플리케이션을 로드하면 하드웨어와 그래픽스 API를 검사하고 현재 환경에 해당하는 그래픽스 티어를 결정합니다.
그래픽스 티어는 다음과 같습니다.
Value | Hardware | Corresponding GraphicsTier enum value | Corresponding shader keyword |
---|---|---|---|
1 | iOS: iPhones before iPhone 5S (not including 5S, but including 5C), iPods up to and including 5th generation, iPads up to 4th generation, iPad mini first generation Desktop: DirectX 9 XR: HoloLens |
Tier1 | UNITY_HARDWARE_TIER1 |
2 | Android: devices that support OpenGL ES 3, devices that support Vulkan iOS: iPhones starting from iPhone 5S, iPad Air, iPad mini 2nd generation, iPod 6th generation, AppleTV WebGL: all devices |
Tier2 | UNITY_HARDWARE_TIER2 |
3 | Desktop: OpenGL, Metal, Vulkan, DirectX 11+ | Tier3 | UNITY_HARDWARE_TIER3 |
Unity는 GraphicsTier 열거형으로 표시된 Graphics.activeTier에 현재 그래픽스 티어 값을 저장합니다.현재 그래픽스 티어를 기반으로 한 커스텀 동작을 추가하려면 이 값에 대해 테스트할 수 있습니다.
Graphics.activeTier
의 값을 오버라이드하려면 직접 설정합니다. Unity가 그래픽스 티어에 따라 달라지는 모든 셰이더를 로드하기 전에 이 작업을 수행해야 합니다. 메인 씬을 로드하기 전에 미리 로드하는 씬에서 이 값을 설정하는 것이 좋습니다.
Unity 에디터에서 티어 설정을 설정할 수 있습니다. 티어 설정을 사용하여 각 티어에 대한 그래픽스 기능을 활성화하거나 비활성화할 수 있습니다.
티어 설정은 Unity 내부 셰이더 코드의 #define
프리프로세서 지시문을 변경하여 작업합니다. 이러한 변경 사항은 빌트인 렌더 파이프라인에 대한 스탠다드 셰이더와 같이 사전에 빌드된 셰이더와 표면 셰이더에 대한 내부 셰이더 라이브러리 코드에 영향을 미칩니다. 티어 설정에 따라 동작을 변경하는 직접 코딩한 셰이더에 코드를 추가할 수도 있습니다. 자세한 내용은 그래픽스 티어와 셰이더 배리언트를 참조하십시오.
기본 티어 설정은 대부분의 사용 사례에 적합할 수 있습니다. 성능 문제가 발생하거나 기본적으로 활성화되지 않는 저사양 기기에서 기능을 활성화하고자 하는 경우에만 변경해야 합니다.
제공된 빌드 타겟의 각 그래픽스에 대해 다른 티어 설정을 설정할 수 있습니다. 티어 설정을 변경할 수 있는 방법은 다음과 같습니다.
에디터에서 티어 설정을 테스트할 수 있습니다. 테스트하려면 Edit > Graphics Tier로 이동한 후 Unity 에디터에서 사용할 티어를 선택합니다.
빌트인 렌더 파이프라인에서 Unity는 그래픽스 티어에 해당하는 셰이더 배리언트를 생성할 수 있습니다.
참고: 이러한 티어 셰이더 배리언트는 일반 셰이더 배리언트와 다르게 작동합니다. 런타임 시 Unity가 CPU 메모리로 셰이더 오브젝트를 로드하면 액티브 티어에 대한 배리언트만 로드합니다. 즉 다른 티어에 대해서는 배리언트를 로드하지 않습니다. 이는 티어 배리언트의 런타임 영향을 줄여줄 수 있습니다.
티어 셰이더 배리언트를 생성하기 위해 Unity는 다음의 셰이더 키워드 세트를 모든 그래픽스 셰이더에 추가합니다.
UNITY_HARDWARE_TIER1
UNITY_HARDWARE_TIER2
UNITY_HARDWARE_TIER3
HLSL 코드에서 이러한 키워드를 사용하여 셰이더 키워드에 대해 사용하는 것과 같은 방식으로 저사양 또는 고사양 하드웨어에 대한 조건부 동작을 작성할 수 있습니다. 예는 다음과 같습니다.
# if UNITY_HARDWARE_TIER1
// Put code for tier 1 devices here
# else
// Put code for other devices here
# endif
HLSL 코드에서 셰이더 키워드로 작업하는 데 대한 정보는 HLSL에서 셰이더 키워드 선언 및 사용을 참조하십시오.
Unity는 다음과 같이 현재 빌드 타겟에 대해 티어 설정에 따라 자동으로 티어 셰이더 배리언트를 생성합니다.
모든 티어 셰이더 배리언트를 생성하고 나면 Unity는 동일한 티어 셰이더 배리언트를 식별하고 중복 항목을 제거합니다. 이는 두 티어에 대한 설정이 동일한 경우(예: 티어1은 다르지만 티어2와 티어3이 서로 동일한 경우) 이러한 배리언트는 애플리케이션의 파일 크기에 추가되지 않으며 Unity가 티어 배리언트를 로드하는 방식은 로딩 시간이나 런타임 메모리 사용에 영향을 주지 않습니다. 하지만 여전히 중복된 컴파일 작업을 발생시킵니다.
티어마다 다른 설정을 사용하고자 하지만 중복된 작업이 발생한다는 점을 알고 있는 경우(예: 애플리케이션이 티어1과 2에서만 실행된다는 사실을 아는 경우) 스크립트를 사용하여 다른 배리언트와 똑같이 컴파일에서 불필요한 티어 배리언트를 제거할 수 있습니다. 자세한 내용은 셰이더 배리언트 스트리핑을 참조하십시오.
자동 동작 외에도 Unity가 셰이더마다 티어 셰이더 배리언트를 생성하도록 할 수도 있습니다. 이렇게 하면 HLSL 코드에 있는 이런 상수를 사용하고 현재 빌드의 티어 설정이 서로 다른지 여부에 상관없이 Unity가 필요한 배리언트를 컴파일하도록 하려는 경우에 유용합니다.
수동으로 조작하여 Unity가 제공된 셰이더에 대한 티어 셰이더 배리언트를 생성하도록 하려면 HLSL 코드의 #pragma hardware_tier_variants
프리 프로세서 지시문을 사용하고 티어 배리언트별로 생성할 그래픽스 API를 지정합니다.
# pragma hardware_tier_variants gles3
이 지시문과 함께 사용할 수 있는 유효한 그래픽스 API 이름의 리스트는 그래픽스 API 타겟팅을 참조하십시오. #pragma
지시문에 대한 일반적인 정보는 프라그마 지시문에서 볼 수 있습니다.