Branching is one way of introducing conditional behavior into shader code.
이 페이지에는 다음 기술에 관한 정보가 포함되어 있습니다.
셰이더 코드의 조건부와 언제 어떤 기술을 사용해야 하는지에 대한 일반적인 개요는 셰이더 코드의 조건부를 참조하십시오.
셰이더 프로그램이 컴파일 시 평가되는 조건부를 포함하는 경우 정적 브랜치를 사용합니다. 컴파일러는 사용되지 않은 브랜치에서 코드를 제외하므로 컴파일된 셰이더 프로그램에 나타나지 않습니다.
내부적으로 Unity는 셰이더 배리언트를 생성할 때 정적 브랜치를 사용합니다. 그러나 정적 브랜치 자체에는 셰이더 배리언트의 성능 단점이 없습니다.
정적 브랜치의 주요 장점은 런타임 성능에 부정적인 영향을 주지 않는다는 것입니다. 정적 브랜치의 주요 단점은 컴파일 시에만 사용할 수 있다는 것입니다.
정적 브랜치는 컴파일러가 셰이더 프로그램에서 불필요한 코드를 제외하는 것을 의미합니다. 그로 인해 필요한 코드만 포함하는 작고 전문화된 셰이더 프로그램이 생성됩니다. 정적 브랜치에는 런타임 성능 소모가 없습니다. 실제로 프로그램이 작을수록 로드 시간이 빨라지고 런타임 메모리 사용량이 낮아질 수 있습니다.
정적 브랜치를 사용하려면 컴파일 시 조건이 일정해야 합니다. 즉 런타임 시 다른 조건에 대한 코드를 실행하는 데 사용할 수 없습니다.
다음과 같은 방법으로 셰이더에서 정적 브랜치를 사용할 수 있습니다.
#if
, #elif
, #else
, and #endif
preprocessor directives, or #ifdef
and #ifndef
preprocessor directives to create static branches.if
문은 동적 브랜치에도 사용할 수 있지만 컴파일러는 컴파일 시간 상수 값을 감지하고 대신 정적 브랜치를 만듭니다.참고: 정적 브랜치는 직접 코딩한 셰이더에서만 사용할 수 있습니다. 셰이더 그래프에서는 정적 브랜치를 만들 수 없습니다.
셰이더 프로그램이 런타임 시 평가되는 조건을 포함하는 경우 동적 브랜치를 사용합니다.
동적 브랜치에는 두 가지 타입이 있습니다. 균일한 변수에 기반한 동적 브랜치와 다른 런타임 값을 기반으로 하는 동적 브랜치입니다. 균일함을 기반으로 하는 브랜치가 전체 드로우 콜에 대해 균일한 값이 일정하기 때문에 일반적으로 더 효율적입니다.
You can use shader keywords for dynamic branching. This allows you to use C# scripts and the Material Inspector to configure runtime branching behavior for your shaders. This results is uniform-based branching; when you do this, Unity compiles the shader keywords as uniforms.
동적 브랜치의 주요 장점은 프로젝트의 셰이더 배리언트 수를 늘리지 않고도 런타임 시 조건부를 사용할 수 있다는 것입니다. 동적 브랜치의 주요 단점은 GPU 성능에 영항을 준다는 것입니다.
GPU 성능 영향은 하드웨어와 셰이더 코드에 따라 다릅니다. 이유는 다음과 같습니다.
일반적으로 코드 브랜치가 균일한 값으로 분기되고 두 브랜치의 워크로드가 거의 비슷하다면 GPU 성능에 미치는 영향은 작을 수 있습니다. 그러나 항상 애플리케이션을 프로파일하고 사례별로 장단점을 고려해야 합니다.
참고: 동적 브랜치는 또한 모든 조건에 대한 코드가 동일한 셰이더 프로그램으로 컴파일되기 때문에 대규모 셰이더 프로그램으로 이어질 수 있습니다. 그러나 이러한 대용량 파일의 로드 시간과 메모리 사용량에 미치는 영향은 일반적으로 셰이더 배리언트의 영향보다 덜 중요합니다.
셰이더에서 조건부를 사용하는 다른 방법과 사용 사례에 적합한 기술을 결정하는 방법에 대한 자세한 내용은 셰이더의 조건부를 참조하십시오.
다음과 같은 방법으로 셰이더에서 동적 브랜치를 사용할 수 있습니다.