때로는 동일한 셰이더가 상황에 따라 다른 작업을 수행하기를 바랄 때가 있습니다.예를 들어 머티리얼마다 다른 설정을 구성하거나, 하드웨어마다 다른 기능을 정의하거나, 런타임에 셰이더의 동작을 동적으로 변경하고 싶을 수 있습니다.텍스처 읽기, 버텍스 입력, 보간기 또는 루프와 같이 필요하지 않은 경우 계산 비용이 많이 드는 코드를 실행하지 않고 싶을 수도 있습니다.
조건부를 사용하여 GPU가 특정 조건에서만 실행하는 동작을 정의할 수 있습니다.
** 다양한 조건부 유형
셰이더에서 조건부를 사용하려면 다음 접근 방식을 사용할 수 있습니다.
셰이더의 조건부에는 "범용" 접근 방식이 없으며 주어진 프로젝트에서 주어진 셰이더에 대한 각 접근 방식의 장점과 단점을 고려해야 합니다.
어떤 조건을 사용할 것인지는 셰이더가 다른 코드 브랜치로 전환해야 하는 시점에 따라 다릅니다.
런타임에 다른 코드 브랜치로 전환하기 위해 셰이더가 필요하지 않은 경우 Unity가 편집하는 동안에만 평가하는 조건부를 사용할 수 있습니다.
예를 들어 머티리얼의 인스펙터 창에서 프로퍼티를 설정하여 셰이더가 다음과 같은 작업을 수행하도록 할 수 있습니다.
이 접근 방식을 사용하면 보다 간단하게 셰이더 코드를 작성하고 유지 관리할 수 있으며, 빌드 시간, 파일 크기 및 성능에 영향을 줄 가능성이 적습니다.
이렇게 하려면 다음 중 하나를 수행하십시오.
shader_feature
키워드 정의를 사용하는 경우 Unity는 빌드에서 머티리얼에 의해 사용되는 셰이더 배리언트를 유지하고 다른 셰이더 배리언트를 제거(’스트리핑’)합니다.이렇게 하면 빌드 시간이 짧고 파일 크기가 작아집니다.
머티리얼에서 누락된 셰이더 배리언트를 사용하는 경우 Unity가 대신 사용 가능한 다른 배리언트를 선택하므로, 런타임에 C# 스크립트를 사용하여 shader_feature
키워드를 활성화 또는 비활성화하지 마십시오.런타임에 키워드를 활성화 또는 비활성화해야 하는 경우 다음 중 하나를 사용하여 빌드에 필요한 모든 배리언트가 포함되도록 하십시오.
shader_feature
키워드 조합에 대한 빌드에 특정 머티리얼을 포함하십시오.런타임에 C# 스크립팅을 사용해서 셰이더를 다른 코드 브랜치로 전환해야 하는 경우, 편집 중에 그리고 런타임에 Unity에서 평가하는 조건부를 사용할 수 있습니다.
예를 들어 C# 스크립트를 사용하여 셰이더가 다음을 수행하도록 만들 수 있습니다.
이렇게 하려면 다음 중 하나를 수행하십시오.
multi_compile
키워드 정의를 사용하는 경우 Unity는 빌드에서 머티리얼이 사용하지 않는 조합을 포함하여 가능한 모든 셰이더 코드 브랜치 조합에 대해 셰이더 배리언트를 빌드합니다.즉, 런타임에 키워드를 활성화 및 비활성화할 수 있지만 빌드 시간, 파일 크기, 로드 시간 및 메모리 사용량이 크게 증가할 수 있습니다.셰이더 배리언트를 참조하십시오.
동적 브랜치는 셰이더 배리언트를 생성하지 않지만, 특히 다음 중 하나라도 해당되는 경우 셰이더가 GPU에서 더 느리게 실행될 수 있습니다.
보유하고 있는 셰이더 배리언트 수를 확인하여 GPU 성능에 큰 영향을 주지 않고 동적 브랜치를 사용할 수 있는지 확인할 수 있습니다.동적 브랜치의 자세한 장단점은 셰이더 브랜치를 참조하십시오.