빌트인 렌더 파이프라인에서는 다양한 기능이 있는 하드웨어에서 애플리케이션을 실행할 때 다른 그래픽스 설정을 적용하기 위해 그래픽스 티어를 사용할 수 있습니다. Unity의 빌트인 티어 설정을 사용하여 공통 설정을 구성하거나 자체 셰이더 코드 또는 C# 코드에서 커스텀 동작을 정의할 수 있습니다.
참고: 이 기능은 빌트인 렌더 파이프라인에서만 지원됩니다. 다른 렌더 파이프라인에서 Unity는 시작 시 하드웨어를 계속 검사하고 Graphics.activeTier에 해당 값을 저장합니다. 하지만 이 필드의 값은 아무런 영향을 미치지 않으며 Unity는 그래픽스 티어와 관련된 다른 작업을 수행하지 않습니다.
Unity가 처음으로 애플리케이션을 로드하면 하드웨어와 그래픽스 API를 검사하고 현재 환경에 해당하는 그래픽스 티어를 결정합니다.
그래픽스 티어는 다음과 같습니다.
| 값 | 하드웨어 | 해당하는 GraphicsTier 열거형 값 | 해당하는 셰이더 키워드 |
|---|---|---|---|
| 1 | iOS: iPhone 5S 이전 iPhone(5S 제외, 5C 포함), 5세대 이하의 iPod, 4세대 이하의 iPad, iPad mini 1세대 데스크톱: DirectX 9 XR: HoloLens |
Tier1 | UNITY_HARDWARE_TIER1 |
| 2 | Android: OpenGL ES 3를 지원하는 기기, Vulkan을 지원하는 기기 iOS: iPhone 5S 이상 iPhone, iPad Air, iPad mini 2세대, iPod 6세대, AppleTV WebGL: 모든 기기 |
Tier2 | UNITY_HARDWARE_TIER2 |
| 3 | 데스크톱: OpenGL, Metal, Vulkan, DirectX 11+ | Tier3 | UNITY_HARDWARE_TIER3 |
빌트인 렌더 파이프라인에서 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 지시문에 대한 일반적인 내용은 pragma 지시문을 참조하십시오.