셰이더 배리언트가 컴파일되지 않게 할 수 있습니다. 이를 스트리핑이라고 합니다. 불필요한 배리언트를 스트리핑하면 빌드 시간, 파일 크기, 셰이더 로딩 시간과 런타임 메모리 사용을 크게 줄일 수 있습니다. 큰 프로젝트나 복잡한 셰이더가 있는 프로젝트에서 반드시 고려해야 합니다.
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:
shader_feature
keyword, don’t use the keyword to change which code branch executes at runtime.셰이더 키워드 선언 방식을 통해 셰이더 키워드가 만드는 배리언트의 수를 제한할 수 있습니다.
shader_feature
instead of multi_compile
where possible - see conditionals in shaders.multi_compile
로 정의하지 않도록 합니다.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.
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:
SHADER_API_DESKTOP
platform, Unity builds variants for every possible keyword combination.#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.
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:
DYNAMIC_LIGHTING
.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
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:
다른 방법으로 스트리핑할 수 없는 셰이더 배리언트의 경우, 에디터 스크립트에서 다음 API를 사용하여 빌드 타임 스트리핑을 수행할 수 있습니다.
IPreprocessShaders.OnProcessShader: Unity가 그래픽스 셰이더 패스를 빌드로 컴파일하기 전에 콜백을 수신합니다. IPreprocessComputeShaders.OnProcessComputeShader: receive a callback before Unity compiles a compute shader into a build.
이 주제에 대한 자세한 내용은 Unity 블로그 포스트 스크립터블 셰이더 배리언트 스트리핑을 참조하십시오.