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

셰이더 배리언트 스트리핑

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

If you strip a shader variant that a Material needs at runtime, Unity tries to choose a similar shader variant that’s available. To avoid this, use the following approaches:

  • If you use a shader_feature keyword, don’t use the keyword to change which code branch executes at runtime.
  • Check what shader variants you have to help you see which shader variants and keyword combinations Materials need at runtime.
  • Add shaders to the Always Included Shaders list in Graphics settings.

Limiting shader variants when you declare shader keywords

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

For information on declaring keywords in hand-coded shaders, see Declaring and using shader keywords in HLSL. For information on declaring keywords in Shader Graph, see Shader Graph: Blackboard.

Use preprocessor macros to limit variants by platform

In Unity 2021.3 and above, you can create conditional shader code using a target platform preprocessor macro, so you can limit variants on platforms with limited memory.

The code sample does the following:

  • If you build for a SHADER_API_DESKTOP platform, Unity builds variants for every possible keyword combination.
  • If you build for another platform, Unity builds only variants for keyword combinations the Materials in your build use.
#ifdef SHADER_API_DESKTOP
   #pragma multi_compile _ RED GREEN BLUE WHITE
#else
   #pragma shader_feature RED GREEN BLUE WHITE
#endif

You can use target platform preprocessor macros to select between shader_feature, multi_compile and dynamic_branch. For more information on when to use each type of conditional, see Shader Conditionals.

Create user-controlled quality settings

When you build for console and mobile platforms that have limited memory, you can limit shader variants by only allowing users to switch between a small number of quality settings.

For example, if you use the keywords DYNAMIC_LIGHTING, SOFT_SHADOWS and HIGH_QUALITY_LIGHTMAPS, you can create the following:

  • A ‘low quality’ setting that turns on DYNAMIC_LIGHTING.
  • A ‘high quality’ setting that turns on DYNAMIC_LIGHTING, SOFT_SHADOWS and HIGH_QUALITY_LIGHTMAPS.

This means Unity won’t create shader variants for DYNAMIC_LIGHTING when it’s off, or the many different combinations of the 3 keywords being on and off.

You can use target platform preprocessor macros to conditionally create fewer quality settings and fewer variants on platforms with limited memory. For example the following code sample will allow users to switch between 8 permutations of settings on SHADER_API_DESKTOP platforms, but only 2 on SHADER_API_MOBILE platforms.

#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

Stripping shader variants in the Editor UI

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

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

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

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

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

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

If you use the Universal Render Pipeline you can also do the following:

If you use the High Definition Render Pipeline you can also do the following:

Stripping shader variants using Editor scripts

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

IPreprocessShaders.OnProcessShader: Unity가 그래픽스 셰이더 패스를 빌드로 컴파일하기 전에 콜백을 수신합니다. IPreprocessComputeShaders.OnProcessComputeShader: receive a callback before Unity compiles a compute shader into a build.

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

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