Unity 셰이더 배리언트 가이드
셰이더 배리언트란?
셰이더 배리언트는 조건부 동작을 셰이더 코드에 도입하는 방법으로, 각 컴파일된 셰이더 프로그램에는 여러 조건에 대한 서로 다른 버전이 있습니다. 런타임 시 Unity는 현재 요구 사항에 맞는 배리언트를 사용하여 성능을 최적화합니다.
주요 개념
- 브랜치: 셰이더 프로그램의 조건부 논리.
- 배리언트: 특정 조건에 따라 다르게 동작하는 셰이더 프로그램의 버전.
- 키워드: 셰이더 코드에서 배리언트를 설정하는 데 사용되는 요소입니다.
장점과 단점
장점
- 조건부 로직을 셰이더 내에 통합하여 GPU 성능 저하 없이 동적 브랜치를 사용할 수 있습니다.
단점
- 배리언트가 많으면 빌드 시간 및 런타임 성능 문제가 발생할 수 있습니다. 대량의 배리언트는 메모리 사용량 및 로딩 시간을 증가시킬 수 있습니다.
셰이더 배리언트 수 확인
- Unity는 각 그래픽스 API와 빌드 타겟마다 1세트의 셰이더 배리언트를 컴파일합니다.
- 각 조합에 대한 배리언트 수는 셰이더 소스 파일과 셰이더 키워드에 따라 달라집니다.
그래픽스 API
- Unity는 각 빌드 타겟의 그래픽스 API에 맞게 서로 다른 셰이더 프로그램을 컴파일합니다.
- 예: Metal iOS 및 Metal macOS는 각각 다른 셰이더를 사용합니다.
셰이더 프로그램 수
- 각 마다몇 개의 고유한 셰이더 프로그램을 정의하는지에 따라 다릅니다.
- 컴퓨트 셰이더는 하나의 셰이더 프로그램을 정의합니다.
키워드가 미치는 영향
- Unity는 컴파일할 셰이더 프로그램을 결정한 후, 각 프로그램에 대해 배리언트를 정의합니다.
- 이 과정에서 키워드 조합에 따라 배리언트의 수가 급격히 증가할 수 있습니다.
코드 스니펫 예제
다음은 간단한 셰이더 배리언트 관련 코드 예제입니다:
Shader "Custom/MyShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
}
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata { ... };
struct v2f { ... };
void vert (in appdata v) {
...
}
void frag (in v2f i) {
...
}
ENDCG
}
}
}
성능 최적화 팁
- 불필요한 배리언트 제거: 자주 사용하지 않는 배리언트를 스트리핑하여 성능을 향상시킵니다.
- 키워드 관리: 사용하지 않는 키워드는 제거하여 배리언트 수를 줄입니다.
- 미리 로드 사용: 런타임 중 빈번하게 필요되는 배리언트는 미리 로드하여 로딩 시간을 단축합니다.
결론
셰이더 배리언트는 Unity에서 그래픽스를 최적화하는 중요한 도구입니다. 세심하게 관리하고 이해함으로써 여러분의 프로젝트에서 성능을 극대화할 수 있습니다.