티스토리 뷰

Unity/Shader

Keywords & Shader Variants

연홍 2021. 1. 22. 13:29
728x90

lighting에 대해 알아보기 전에 키워드와 셰이더 변형(shader variants)에 대해 이야기해야합니다. 키워드와 셰이더 변형은 URP ShaderLibrary에서 사용되기 때문입니다. lighting함수가 제대로 작동하도록하려면 실제로 무엇을하는지 아는 것이 중요합니다.

셰이더에서는 더 많은 #pragma 지시문을 지정할 수 있으며 그중 일부에는 multi_compile 및 shader_feature가 포함됩니다. 셰이더 코드의 특정 부분을 "켜거나" "끄기"위한 키워드를 지정하는 데 사용할 수 있습니다. 셰이더는 실제로 셰이더 변형으로 알려진 여러 버전의 셰이더로 컴파일됩니다.

MULTI_COMPILE

#pragma multi_compile _A _B _C (...etc)

이 예에서는 셰이더의 세 가지 변형을 생성합니다. 여기서 _A, _B 및 _C는 키워드입니다.

셰이더 코드에서 다음과 같은 것을 사용할 수 있습니다.

#ifdef _A
// compile this code if A is enabled
#endif
 
#ifndef _B
// compile this code if B is disabled, aka only in A and C.
// note the extra "n" in the #ifndef, for "if not defined"
#else
// compile this code if B is enabled
#endif
 
#if defined(_A) || defined(_C)
// 이 코드를 A 또는 C로 컴파일합니다. (다른 키워드가 없다고 가정하고 위와 동일)
// 여러 조건을 원할 경우 긴 형식의 "#if defined ()"를 사용해야합니다.
// (|| = or, && = and)
// 그러나 키워드는 하나의 multi_compile 문에 정의되어 있으므로
// 둘 다 활성화하는 것은 실제로 불가능하므로 여기서 &&는 의미가 없습니다.
#endif
 
// There's also #elif, for an else if statement.

SHADER_FEATURE

#pragma shader_feature _A _B

shader feature는 사용되지 않는 변형이 최종 빌드에 포함되지 않는다는 점을 제외하고는 multi_compile과 정확히 동일하게 작동합니다. 이러한 이유로 필요한 셰이더가 빌드에 포함되지 않을 수 있으므로 런타임에 이러한 키워드를 활성화/비활성화하는 것은 좋지 않습니다. 런타임에 키워드를 처리해야하는 경우 대신 multi_compile을 사용하십시오.

SHADER VARIANTS

multi_compile 및 shader_feature가 추가 될 때마다 활성화/비활성화 된 키워드의 가능한 각 조합에 대해 더 많은 셰이더 변형을 생성합니다. 예를 들면 다음과 같습니다.

#pragma multi_compile _A _B _C
#pragma multi_compile _D _E
#pragma shader_feature _F _G

여기에서 첫번째 줄은 3 가지 셰이더 변형을 생성합니다. 그러나 두 번째 줄에서는 _D 또는 _E가 이미 활성화 된 변형에 대해 2 개의 셰이더 변형을 생성해야합니다.

A & D
A & E
B & D
B & E
C & D
C & E

이제 6 개의 변형이 생겨납니다.

 

세 번째 줄은 각 6 개에 대한 또 다른 2 개의 변형이므로 이제 총 12 개의 셰이더 변형이 있습니다. 해당 라인은 shader_feature이므로 이러한 변형 중 일부는 빌드에 포함되지 않을 수 있습니다.

2 개의 키워드를 사용하여 추가 된 각 multi_compile은 생성 된 변형의 양을 두 배로 늘릴 것이므로이 중 10 개를 포함하는 셰이더는 1024 개의 셰이더 변형이됩니다! 최종 빌드에 포함되어야하는 각 셰이더 변형을 컴파일해야하므로 빌드 시간과 빌드크기가 늘어납니다.

셰이더가 생성하는 셰이더 변형 수를 확인하려면 셰이더를 클릭하고 검사기에서 "Compile and Show Code"버튼을 클릭하면 그 옆에 포함 된 변형 수를 나열하는 작은 드롭 다운 화살표가 있습니다. "skip unused shader_features"를 클릭하면 대신 총 변형 수를 표시하도록 전환 할 수 있습니다.

또한 정점 또는 프래그먼트 프로그램에 대해서만 셰이더 변형을 컴파일하는 데 사용할 수있는 이러한 지시문의 "vertex"및 "fragment"버전이 있어 총 변형 수를 줄입니다. 예 :

#pragma multi_compile_vertex _ _A
#pragma multi_compile_fragment _ _B
// also shader_feature_vertex and shader_feature_fragment

이 예에서 _A 키워드는 정점 프로그램에만 사용되고 _B는 조각에만 사용됩니다. _A 및 _B가 모두 활성화 된 변형은있을 수 없습니다. Unity는 이것이 실제 컴파일 된 코드를 볼 때 둘 다 비활성화 된 하나의 셰이더 변형과 두 개의 "half"변형과 비슷하지만 이것이 2 개의 셰이더 변형을 생성한다고 말합니다.

이상하게도 문서화 된 문서는 본 적이 없지만 다른 몇몇 사람들이 fragment one을 언급하는 것을 보았고 vertex one을 테스트했고 작동했습니다. (그래도 모든 플랫폼에서 작동하지는 않을까요?)

MAXIMUM KEYWORDS

프로젝트 당 최대 256 개의 키워드가 있으므로 다른 셰이더의 명명 규칙을 고수하는 것이 좋습니다.
또한 많은 multi_compile 및 shader_features에서 첫 번째 키워드는 일반적으로 "_"로만 남습니다. 이것은 실제로 키워드를 생성하지 않으므로 다른 키워드에 사용할 수있는 공간을 최대 256 개까지 남겨 둡니다.

#pragma multi_compile _ _KEYWORD
 
#pragma shader_feature _KEYWORD
// 아래 내용을 축약한것.
// #pragma shader_feature _ _KEYWORD
 
// 해당 키워드가 비활성화되어 있는지 알아야하는 경우
// 그러면 대신이 작업을 수행 할 수 있습니다.
#ifndef _KEYWORD
// or #if !defined(_KEYWORD)
// or #ifdef _KEYWORD #else
// code
#endif

multi_compile 및 shader_feature의 로컬 버전을 사용하여 최대 키워드 수를 사용하지 않도록 할 수도 있습니다. 이는 해당 셰이더에 로컬 인 키워드를 생성하지만 셰이더 당 최대 64 개의 로컬 키워드도 있습니다.

#pragma multi_compile_local _ _KEYWORD
#pragma shader_feature_local _KEYWORD
 
// There's also local_fragment/vertex ones too!
#pragma multi_compile_local_fragment _ _KEYWORD
#pragma shader_feature_local_vertex _KEYWORD

셰이더 변형에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

'Unity > Shader' 카테고리의 다른 글

PBR Lighting  (0) 2021.01.25
Lighting Introduction  (0) 2021.01.22
Fragment Shader  (0) 2021.01.21
Vertex Shader  (0) 2021.01.21
Post Processing in the Universal RP  (0) 2021.01.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31