Version: Unity 6.0 (6000.0)
언어 : 한국어
보유하고 있는 셰이더 배리언트 수 확인
기본 셰이더 키워드

셰이더 배리언트 스트리핑

셰이더 배리언트의 컴파일을 방지할 수 있습니다. 이를 스트리핑이라고 합니다. 불필요한 배리언트를 스트리핑하면 빌드 시간, 파일 크기, 셰이더 로딩 시간, 런타임 메모리 사용량을 줄일 수 있습니다. 대규모 프로젝트나 복잡한 셰이더가 있는 프로젝트에서 이는 매우 중요한 고려 사항입니다.

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

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

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

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

  • 가능한 경우 multi_compile 대신 shader_feature를 사용합니다. 셰이더의 조건부를 참조하십시오.
  • 사용하지 않는 키워드를 multi_compile로 정의하지 않도록 합니다.

직접 코딩한 셰이더에서의 키워드 선언에 대한 정보는 HLSL에서 셰이더 키워드 선언 및 사용을 참조하십시오. Shader Graph에서의 키워드 선언에 대한 내용은 Shader Graph: Blackboard를 확인하십시오.

어떤 셰이더 키워드가 어느 셰이더 단계에 영향을 미치는지 지정하기

키워드를 선언하면 Unity는 셰이더의 모든 단계에 해당 키워드에 대한 조건부 코드가 포함되어 있다고 가정합니다.

다음 접미사를 추가하여 특정 단계에만 키워드에 대한 조건부 코드가 포함되어 있다는 것을 나타내면 Unity가 불필요한 셰이더 배리언트를 생성하지 않습니다.

  • _vertex
  • _fragment
  • _hull
  • _domain
  • _geometry

예를 들어 #pragma shader_feature_fragment RED GREEN BLUE를 사용하여 프래그먼트 단계에서만 조건부 코드를 생성하는 3개의 키워드를 사용한다는 것을 나타낼 수 있습니다.

dynamic_branch가 배리언트를 생성하지 않으므로 이러한 접미사를 #pragma dynamic_branch에 추가할 수 없습니다.

이러한 접미사는 그래픽스 API에 따라 다르게 동작하거나 영향을 미치지 않을 수 있습니다. 예시:

  • 접미사는 OpenGL, OpenGL ES, Vulkan에 영향을 미치지 않습니다.
  • _geometry_raytracing 접미사는 Metal에 영향을 미치지 않습니다. Metal은 _vertex, _hull, _domain을 하나의 단계로 취급합니다.

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

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를 사용하여 빌드 타임 스트리핑을 수행할 수 있습니다.

이 주제에 대한 상세 내용은 스크립터블 셰이더 배리언트 스트리핑을 참고하십시오.

보유하고 있는 셰이더 배리언트 수 확인
기본 셰이더 키워드