Version: 2022.3
언어: 한국어
브랜치, 배리언트, 키워드
셰이더에서 브랜치

셰이더의 조건부

때로는 동일한 셰이더가 상황에 따라 다른 작업을 수행하기를 바랄 때가 있습니다.예를 들어 머티리얼마다 다른 설정을 구성하거나, 하드웨어마다 다른 기능을 정의하거나, 런타임에 셰이더의 동작을 동적으로 변경하고 싶을 수 있습니다.텍스처 읽기, 버텍스 입력, 보간기 또는 루프와 같이 필요하지 않은 경우 계산 비용이 많이 드는 코드를 실행하지 않고 싶을 수도 있습니다.

조건부를 사용하여 GPU가 특정 조건에서만 실행하는 동작을 정의할 수 있습니다.

** 다양한 조건부 유형

셰이더에서 조건부를 사용하려면 다음 접근 방식을 사용할 수 있습니다.

  • 정적 브랜치: 셰이더 컴파일러가 컴파일 시 조건부 코드를 평가합니다.
  • 동적 브랜치: GPU가 런타임 시 조건부 코드를 평가합니다.
  • 셰이더 배리언트: Unity는 정적 브랜치를 사용하여 셰이더 소스 코드를 여러 셰이더 프로그램으로 컴파일합니다. 그런 다음 Unity는 런타임 시 조건부와 일치하는 셰이더 프로그램을 사용합니다.

조건부의 타입과 사용 시기

셰이더의 조건부에는 "범용" 접근 방식이 없으며 주어진 프로젝트에서 주어진 셰이더에 대한 각 접근 방식의 장점과 단점을 고려해야 합니다.

어떤 조건을 사용할 것인지는 셰이더가 다른 코드 브랜치로 전환해야 하는 시점에 따라 다릅니다.

편집 중에 코드 브랜치 전환

런타임에 다른 코드 브랜치로 전환하기 위해 셰이더가 필요하지 않은 경우 Unity가 편집하는 동안에만 평가하는 조건부를 사용할 수 있습니다.

예를 들어 머티리얼의 인스펙터 창에서 프로퍼티를 설정하여 셰이더가 다음과 같은 작업을 수행하도록 할 수 있습니다.

  • 머티리얼의 일부 인스턴스에는 스페큘러 반사를 추가하지만 다른 인스턴스에는 추가하지 않습니다.
  • 수중 씬에 나타나는 오브젝트와 같은 특정 오브젝트에 다른 모양을 추가합니다.

이 접근 방식을 사용하면 보다 간단하게 셰이더 코드를 작성하고 유지 관리할 수 있으며, 빌드 시간, 파일 크기 및 성능에 영향을 줄 가능성이 적습니다.

이렇게 하려면 다음 중 하나를 수행하십시오.

shader_feature 키워드 정의를 사용하는 경우 Unity는 빌드에서 머티리얼에 의해 사용되는 셰이더 배리언트를 유지하고 다른 셰이더 배리언트를 제거(’스트리핑’)합니다.이렇게 하면 빌드 시간이 짧고 파일 크기가 작아집니다.

머티리얼에서 누락된 셰이더 배리언트를 사용하는 경우 Unity가 대신 사용 가능한 다른 배리언트를 선택하므로, 런타임에 C# 스크립트를 사용하여 shader_feature 키워드를 활성화 또는 비활성화하지 마십시오.런타임에 키워드를 활성화 또는 비활성화해야 하는 경우 다음 중 하나를 사용하여 빌드에 필요한 모든 배리언트가 포함되도록 하십시오.

런타임에 코드 브랜치 전환

런타임에 C# 스크립팅을 사용해서 셰이더를 다른 코드 브랜치로 전환해야 하는 경우, 편집 중에 그리고 런타임에 Unity에서 평가하는 조건부를 사용할 수 있습니다.

예를 들어 C# 스크립트를 사용하여 셰이더가 다음을 수행하도록 만들 수 있습니다.

  • 머티리얼을 동적으로 변경하여 특정 시간에 눈이 내리게 만들기
  • 사용자가 품질 설정을 변경할 때 특정 머티리얼을 변경하여 사용자가 예를 들어 안개 표시 여부를 동적으로 제어할 수 있도록 만들기

이렇게 하려면 다음 중 하나를 수행하십시오.

multi_compile 키워드 정의를 사용하는 경우 Unity는 빌드에서 머티리얼이 사용하지 않는 조합을 포함하여 가능한 모든 셰이더 코드 브랜치 조합에 대해 셰이더 배리언트를 빌드합니다.즉, 런타임에 키워드를 활성화 및 비활성화할 수 있지만 빌드 시간, 파일 크기, 로드 시간 및 메모리 사용량이 크게 증가할 수 있습니다.셰이더 배리언트를 참조하십시오.

동적 브랜치는 셰이더 배리언트를 생성하지 않지만, 특히 다음 중 하나라도 해당되는 경우 셰이더가 GPU에서 더 느리게 실행될 수 있습니다.

  • 셰이더가 성능이 낮은 GPU에서 실행되는 경우
  • 조건부 코드에 ’비대칭 브랜치’가 있어서 한 브랜치가 다른 브랜치보다 길거나 복잡한 코드인 경우

보유하고 있는 셰이더 배리언트 수를 확인하여 GPU 성능에 큰 영향을 주지 않고 동적 브랜치를 사용할 수 있는지 확인할 수 있습니다.동적 브랜치의 자세한 장단점은 셰이더 브랜치를 참조하십시오.

브랜치, 배리언트, 키워드
셰이더에서 브랜치