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

셰이더의 조건부

Sometimes, you want the same shader to do different things under different circumstances. For example, you might want to configure different settings for different materials, define functionality for different hardware, or dynamically change the behavior of shaders at runtime. You might also want to avoid executing computationally expensive code when it’s not needed, such as texture reads, vertex inputs, interpolators, or loops.

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

** 다양한 조건부 유형

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

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

조건부의 타입과 사용 시기

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

Which conditional to use depends on when you need the shader to switch to a different code branch:

Switch code branch while you’re editing

If you don’t need a shader to switch to a different code branch at runtime, you can use conditionals that Unity only evaluates while you’re editing.

For example you can set up a property in a Material’s Inspector window to make a shader do the following:

  • Add specular reflections to some instances of a material but not others.
  • Add a different look to certain objects, such as objects that appear in underwater scenes.

If you use this approach, shader code is simpler to write and maintain, and less likely to affect build time, file size and performance.

To do this, use one of the following:

If you use the shader_feature keyword definition, Unity keeps shader variants used by Materials in your build, and removes (‘strips’) other shader variants. This keeps build times low and file sizes small.

Avoid using a C# script to enable or disable shader_feature keywords at runtime, because if a Material uses a shader variant that’s missing, Unity chooses a different available variant instead. If you do need to enable or disable keywords at runtime, use one of the following approaches to make sure your build includes all the variants you need:

Switch code branch at runtime

If you need to use C# scripting to make the shader switch to a different code branch at runtime, you can use conditionals that Unity evaluates both while you’re editing and at runtime.

For example you can use a C# script to make a shader do the following:

  • Change a Material dynamically so it has snow on it at certain times.
  • Change a Material when a user changes quality settings, for example to give users dynamic control over whether fog appears.

To do this, use one of the following:

If you use the multi_compile keyword definition, Unity builds a shader variant for every possible combination of shader code branches, including combinations that aren’t used by Materials in your build. This means you can enable and disable keywords at runtime, but it might also greatly increase build time, file size, load times and memory usage. See shader variants.

Dynamic branching doesn’t create shader variants, but may mean your shaders run more slowly on the GPU, especially if any of the following are true:

  • Your shaders run on a less capable GPU.
  • Your conditional code has ‘asymmetric branches’, where one branch is longer or more complex code than the other.

You can check how many shader variants you have to see whether you can use dynamic branching without affecting GPU performance too much. See shader branching for more on the advantages and disadvantages of dynamic branching.

브랜치, 배리언트, 키워드
셰이더에서 브랜치
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961