Version: 2022.3
언어: 한국어
셰이더 키워드와 머티리얼 인스펙터 함께 사용
셰이더 배리언트 컬렉션

셰이더 배리언트 스트리핑

셰이더 배리언트가 컴파일되지 않게 할 수 있습니다. 이를 스트리핑이라고 합니다. 불필요한 배리언트를 스트리핑하면 빌드 시간, 파일 크기, 셰이더 로딩 시간과 런타임 메모리 사용을 크게 줄일 수 있습니다. 큰 프로젝트나 복잡한 셰이더가 있는 프로젝트에서 반드시 고려해야 합니다.

런타임 시 머티리얼에 필요한 셰이더 배리언트를 스트리핑하는 경우 Unity는 사용 가능한 유사한 셰이더 배리언트를 선택하려고 합니다.이를 방지하려면 다음 접근 방법을 사용하십시오.

  • shader_feature 키워드를 사용하는 경우 런타임 시 실행되는 코드 브랜치를 변경하는 데 키워드를 사용하지 마십시오.
  • 보유하고 있는 셰이더 배리언트 확인을 통해 런타임 시 머티리얼에 필요한 셰이더 배리언트 및 키워드 조합을 확인할 수 있습니다.
  • 셰이더를 그래픽스 설정Always Included Shaders 리스트에 추가합니다.

셰이더 키워드 선언 시 셰이더 배리언트 제한

셰이더 키워드 선언 방식을 통해 셰이더 키워드가 만드는 배리언트의 수를 제한할 수 있습니다.

직접 코딩한 셰이더에서의 키워드 선언에 대한 자세한 내용은 HLSL에서 셰이더 키워드 선언 및 사용을 참조하십시오.셰이더 그래프에서의 키워드 선언에 대한 자세한 내용은 셰이더 그래프:Blackboard를 참조하십시오.

프리 프로세서 매크로를 사용하여 플랫폼별로 배리언트 제한

Unity 2021.3 이상에서는 타겟 플랫폼 프리 프로세서 매크로를 사용하여 조건부 셰이더 코드를 생성할 수 있으므로 메모리가 제한적인 플랫폼에서 배리언트를 제한할 수 있습니다.

코드 예시는 다음을 수행합니다.

  • SHADER_API_DESKTOP 플랫폼용으로 빌드하는 경우 Unity는 가능한 모든 키워드 조합에 대해 배리언트를 빌드합니다.
  • 다른 플랫폼용으로 빌드하는 경우 Unity는 빌드의 머티리얼이 사용하는 키워드 조합에 대한 배리언트만 빌드합니다.
# ifdef SHADER_API_DESKTOP
   #pragma multi_compile _ RED GREEN BLUE WHITE
# else
   #pragma shader_feature RED GREEN BLUE WHITE
# endif

타겟 플랫폼 프리 프로세서 매크로를 사용하여 shader_feature, multi_compile, dynamic_branch 중에서 선택할 수 있습니다.각 타입의 조건부 사용 시기에 대한 자세한 내용은 셰이더 조건부를 참조하십시오.

사용자가 제어하는 품질 설정 생성

메모리가 제한적인 콘솔 및 모바일 플랫폼용으로 빌드하는 경우, 사용자가 몇 가지의 품질 설정 간에 전환만 할 수 있도록 하여 셰이더 배리언트를 제한할 수 있습니다.

예를 들어 키워드 DYNAMIC_LIGHTING, SOFT_SHADOWS, HIGH_QUALITY_LIGHTMAPS를 사용하는 경우 다음을 생성할 수 있습니다.

  • DYNAMIC_LIGHTING을 활성화하는 ‘저품질’ 설정
  • DYNAMIC_LIGHTING, SOFT_SHADOWS, HIGH_QUALITY_LIGHTMAPS를 활성화하는 ‘고품질’ 설정

즉, DYNAMIC_LIGHTING이 비활성화 되어 있거나 3가지 키워드가 다양한 조합으로 활성화 및 비활성화되어 있는 경우, Unity는 DYNAMIC_LIGHTING에 대한 셰이더 배리언트를 생성하지 않습니다.

타겟 플랫폼 프리 프로세서 매크로를 사용하면 메모리가 제한적인 플랫폼에서 더 적은 수의 품질 설정과 더 적은 수의 배리언트를 조건부로 생성할 수 있습니다.예를 들어 사용자는 다음 코드 샘플로 SHADER_API_DESKTOP 플랫폼에서 8가지 설정 순열 간에 전환할 수 있지만, SHADER_API_MOBILE 플랫폼에서는 2가지 간에 전환할 수 있습니다.

# if SHADER_API_DESKTOP
   #pragma multi_compile SHADOWS_LOW SHADOWS_HIGH
   #pragma multi_compile REFLECTIONS_LOW REFLECTIONS_HIGH
   #pragma multi_compile CAUSTICS_LOW CAUSTICS_HIGH
# elif SHADER_API_MOBILE
   #pragma multi_compile QUALITY_LOW QUALITY_HIGH
   #pragma shader_feature CAUSTICS // Uses shader_feature, so Unity strips variants that use CAUSTICS if there are no Materials that use the keyword at build time.
# endif

에디터 UI에서 셰이더 배리언트 스트리핑

Unity 에디터 UI의 여러 위치에서 셰이더 스트리핑을 설정할 수 있습니다.

  • Graphics Settings 창Shader stripping 섹션에서 다음과 같이 설정합니다.

  • 불필요한 셰이더가 Always-included shaders 설정에 포함되지 않도록 합니다.

  • GPU 인스턴싱, 라이트매핑 및 안개와 관련된 배리언트를 스트리핑합니다.

  • 빌트인 렌더 파이프라인에서는 티어 설정이 다른 것이 중요하지 않다면 티어 설정이 동일하게 하십시오. 자세한 내용은 그래픽스 티어를 참조하십시오.

  • 유니버설 렌더 파이프라인(URP)의 URP 에셋에서 미사용 기능을 비활성화하십시오. 자세한 내용은 셰이더 스트리핑을 참조하십시오.

유니버설 렌더 파이프라인을 사용하는 경우 다음을 수행할 수도 있습니다.

고해상도 렌더 파이프라인을 사용하는 경우 다음을 수행할 수도 있습니다.

에디터 스크립트를 사용하여 셰이더 배리언트 스트리핑

다른 방법으로 스트리핑할 수 없는 셰이더 배리언트의 경우, 에디터 스크립트에서 다음 API를 사용하여 빌드 타임 스트리핑을 수행할 수 있습니다.

이 주제에 대한 자세한 내용은 Unity 블로그 포스트 스크립터블 셰이더 배리언트 스트리핑을 참조하십시오.

셰이더 키워드와 머티리얼 인스펙터 함께 사용
셰이더 배리언트 컬렉션