Version: 2023.1
언어: 한국어
HLSL로 그래픽스 API 및 플랫폼 타게팅
셰이더 시맨틱

HLSL에서 셰이더 키워드 선언 및 사용

키워드를 활성화하거나 비활성화할 때 셰이더가 다르게 작동하도록 셰이더 키워드를 선언할 수 있습니다.

표면 셰이더컴퓨트 셰이더를 비롯한 일반 그래픽스 셰이더에서 셰이더 키워드를 선언할 수 있습니다.

pragma를 사용한 셰이더 키워드 선언

셰이더 키워드를 선언하려면 HLSL 코드에서 #pragma 지시문을 사용하십시오.예시:

# pragma shader_feature REFLECTION_TYPE1 REFLECTION_TYPE2 REFLECTION_TYPE3

다음 셰이더 지시문 중 하나를 사용할 수 있습니다.

셰이더 지시문 브랜칭 타입 Unity가 생성한 셰이더 배리언트
shader_feature 정적 브랜칭 빌드 시 활성화하는 키워드 조합에 대한 배리언트
multi_compile 정적 브랜칭 가능한 모든 키워드 조합에 대한 배리언트
dynamic_branch 동적 브랜칭 배리언트 없음

셰이더 지시문 사용 시기에 대해 자세히 알아보십시오.

셰이더 키워드 제한을 참조하십시오.

키워드 세트 작동 방식

단일 #pragma 문에 있는 키워드를 함께 ’세트’라고 합니다.세트에 있는 여러 키워드를 동시에 활성화하거나 비활성화할 수 있습니다.

다음 예시에서는 세 개의 키워드가 포함된 세트를 선언합니다.

# pragma shader_feature REFLECTION_TYPE1 REFLECTION_TYPE2 REFLECTION_TYPE3

하나의 셰이더에서 여러 개의 키워드 세트를 선언할 수도 있습니다.다음 예시에서는 2개의 세트를 생성합니다.

# pragma shader_feature REFLECTION_TYPE1 REFLECTION_TYPE2 REFLECTION_TYPE3
# pragma shader_feature RED GREEN BLUE WHITE

다음과 같이 할 수는 없습니다.

  • 한 세트에 동일한 이름을 가진 키워드 두 개를 포함
  • 하나의 셰이더에 복제 키워드 세트 포함
  • 키워드를 dynamic_branchshader_feature 둘 다로 선언하거나 multi_compile로 선언(Unity는 이렇게 하면 dynamic_branch를 사용)

셰이더 동작 조건부 만들기

셰이더 키워드 활성화 또는 비활성화 여부에 따라 셰이더 코드 조건부의 일부를 표시하려면 HLSL if 문을 사용하십시오.

예제:

# pragma multi_compile QUALITY_LOW QUALITY_MED QUALITY_HIGH

if (QUALITY_LOW)
{
    // code for low quality setting
}

인스펙터 사용 또는 C# 스크립팅을 통해 키워드를 활성화하고 비활성화할 수 있습니다.

Unity가 셰이더 코드로 수행하는 작업은 사용하는 셰이더 지시문에 따라 다릅니다.

dynamic_branch를 사용하는 경우 Unity는 각 키워드에 대해 균일한 부울 변수를 생성합니다.키워드를 활성화하면 Unity는 해당 변수에 대한 부울을 true로 설정하며 GPU는 해당 키워드에 대한 if 문에 있는 코드를 사용하도록 전환합니다.이는 동적 브랜칭입니다.

shader_feature 또는 multi_compile을 사용하는 경우 Unity는 각 키워드 상태에 대해 별도의 셰이더 배리언트를 생성합니다.각 배리언트에는 해당 키워드에 대한 if 브랜치의 코드가 포함되어 있습니다.키워드를 활성화하면 Unity는 일치하는 배리언트를 GPU로 전송합니다.이는 정적 브랜칭입니다.

셰이더 지시문 사용 시기에 대해 자세히 알아보십시오.

다른 문을 사용하여 셰이더 동작 조건부 만들기

다음 HLSL 문을 사용하여 조건부 코드를 생성할 수도 있습니다.

if 대신 이러한 문을 사용하면 나중에 #pragma 키워드 지시문을 변경하기 더 어려울 수 있습니다.예를 들어 셰이더 배리언트 수를 줄여야 하는 경우 multi_compileshader_feature로 변경하는 것이 더 어렵습니다.

키워드를 로컬로 만들기

키워드는 기본적으로 전역입니다.

_local을 셰이더 지시문에 추가하여 키워드를 로컬로 만들 수 있습니다.전역 키워드를 활성화하거나 비활성화하는 경우 동일한 이름을 가진 로컬 키워드의 상태에는 영향을 미치지 않습니다.

예제:

# pragma shader_feature_local QUALITY_LOW QUALITY_MED QUALITY_HIGH

키워드를 셰이더 단계로 제한

키워드를 선언하면 Unity는 셰이더의 모든 단계에 해당 키워드에 대한 조건부 코드가 포함되어 있다고 가정합니다.

다음 접미사를 추가하여 특정 단계에만 키워드에 대한 조건부 코드가 포함되어 있다는 것을 나타낼 수 있습니다.이렇게 하면 Unity가 필요하지 않은 셰이더 배리언트를 제거하는 데 도움이 됩니다.

  • _vertex
  • _fragment
  • _hull
  • _domain
  • _geometry
  • _raytracing

예를 들어 #pragma shader_feature_fragment RED GREEN BLUE를 사용하여 프래그먼트 단계에서만 조건부 코드를 생성하는 3개의 키워드를 사용한다는 것을 나타낼 수 있습니다.

dynamic_branch는 배리언트를 생성하지 않기 때문에 이러한 접미사를 #pragma dynamic_branch에 추가할 수 없습니다.

이러한 접미사는 그래픽스 API에 따라 다르게 동작하거나 영향을 미치지 않을 수 있습니다.

  • 접미사는 OpenGL, OpenGL ES, Vulkan에 영향을 미치지 않습니다.
  • _geometry_raytracing 접미사는 Metal에 영향을 미치지 않으며, Metal은 _vertex, _hull, _domain을 하나의 단계로 취급합니다.

키워드를 셰이더 모델 및 GPU 기능으로 제한

키워드를 #pragma require#pragma target 지시문에 추가하여 현재 하드웨어가 특정 셰이더 모델이나 GPU 기능을 사용하는 경우에만 조건부 코드를 실행하도록 할 수 있습니다.

자세한 내용은 HLSL의 셰이더 모델 타게팅 및 GPU 기능을 참조하십시오.

비활성화된 키워드에 대한 셰이더 배리언트 생성

shader_feature를 사용하여 단일 키워드를 생성하는 경우 Unity는 기능이 비활성화되었을 경우를 위해 두 번째 배리언트를 자동으로 생성합니다.이렇게 하면 활성화하고 비활성화해야 하는 키워드 수를 줄이는 데 도움이 됩니다.예를 들어 다음 코드는 2개의 배리언트를 생성합니다.

# pragma shader_feature EXAMPLE_ON

Multi_compile 또는 shader_feature를 사용하여 두 세트 이상의 키워드를 생성하는 경우, 키워드 세트를 선언할 때 _를 사용할 수 있습니다.Unity는 해당 세트에 있는 모든 키워드가 비활성화되는 상황을 위해 셰이더 배리언트를 생성합니다.

# pragma multi_compile _ EXAMPLE_ON
# pragma shader_feature _ RED GREEN BLUE WHITE

단축키를 사용하여 키워드 세트 생성

Unity 셰이더 지시문 단축키를 사용하여 셰이더 배리언트 세트를 생성할 수 있습니다.다음 예시에서는 SHADOWS_DEPTHSHADOWS_CUBE 배리언트를 추가하는 방법에 대해 설명합니다.

# pragma multi_compile_shadowcaster

skip_variants를 사용하여 필요하지 않은 키워드를 제거할 수 있습니다.예를 들어 Unity가 multi_compile_fwdadd에서 배리언트를 생성할 때 다음을 사용하여 POINTPOINT_COOKIES 배리언트를 제거할 수 있습니다.

# pragma multi_compile_fwdadd
# pragma skip_variants POINT POINT_COOKIE

다음의 단축키는 빌트인 렌더 파이프라인의 광원, 그림자 및 라이트매핑과 관련됩니다.

  • multi_compile_fwdbase는 DIRECTIONAL LIGHTMAP_ON DIRLIGHTMAP_COMBINED DYNAMICLIGHTMAP_ON SHADOWS_SCREEN SHADOWS_SHADOWMASK LIGHTMAP_SHADOW_MIXING LIGHTPROBE_SH 키워드 세트를 추가합니다. PassType.ForwardBase가 이러한 배리언트를 필요로 합니다.
  • multi_compile_fwdbasealpha는 DIRECTIONAL LIGHTMAP_ON DIRLIGHTMAP_COMBINED DYNAMICLIGHTMAP_ON LIGHTMAP_SHADOW_MIXING VERTEXLIGHT_ON LIGHTPROBE_SH 키워드 세트를 추가합니다. PassType.ForwardBase가 이러한 배리언트를 필요로 합니다.
  • multi_compile_fwdadd는 POINT DIRECTIONAL SPOT POINT_COOKIE DIRECTIONAL_COOKIE 키워드 세트를 추가합니다. PassType.ForwardAdd가 이러한 배리언트를 필요로 합니다.
  • multi_compile_fwdadd_fullshadows는 POINT DIRECTIONAL SPOT POINT_COOKIE DIRECTIONAL_COOKIE SHADOWS_DEPTH SHADOWS_SCREEN SHADOWS_CUBE SHADOWS_SOFT SHADOWS_SHADOWMASK LIGHTMAP_SHADOW_MIXING 키워드 세트를 추가합니다. multi_compile_fwdadd와 동일하지만, 광원이 실시간 그림자를 가질 수 있는 기능을 추가합니다.
  • multi_compile_lightpass는 POINT DIRECTIONAL SPOT POINT_COOKIE DIRECTIONAL_COOKIE SHADOWS_DEPTH SHADOWS_SCREEN SHADOWS_CUBE SHADOWS_SOFT SHADOWS_SHADOWMASK LIGHTMAP_SHADOW_MIXING 키워드 세트를 추가합니다. 실질적으로 라이트 프로브 외 실시간 광원과 그림자와 관련된 모든 기능을 위한 포괄적 단축키입니다.
  • multi_compile_shadowcaster는 SHADOWS_DEPTH SHADOWS_CUBE 키워드 세트를 추가합니다. PassType.ShadowCaster가 이러한 배리언트를 필요로 합니다.
  • multi_compile_shadowcollector는 SHADOWS_SPLIT_SPHERES SHADOWS_SINGLE_CASCADE 키워드 세트를 추가합니다. 또한 이러한 키워드 없이도 배리언트를 컴파일합니다. 이러한 배리언트는 스크린 공간 그림자에 필요합니다.
  • multi_compile_prepassfinal은 다음 키워드 세트를 추가합니다.LIGHTMAP_ON DIRLIGHTMAP_COMBINED DYNAMICLIGHTMAP_ON UNITY_HDR_ON SHADOWS_SHADOWMASK LIGHTPROBE_SH.또한 이러한 키워드 없이도 배리언트를 컴파일합니다.PassType.Deferred가 이러한 배리언트를 필요로 합니다.

다음 단축키는 기타 설정과 관련됩니다.

  • multi_compile_particles는 빌트인 파티클 시스템에 관련된 SOFTPARTICLES_ON 키워드를 추가합니다. 또한 이 키워드 없이도 배리언트를 컴파일합니다. 자세한 내용은 빌트인 파티클 시스템을 참조하십시오.
  • multi_compile_fog는 안개에 관련된 FOG_LINEAR, FOG_EXP, FOG_EXP2 키워드 세트를 추가합니다. 또한 이러한 키워드 없이도 배리언트를 컴파일합니다. Graphics settings 창에서 이 동작을 컨트롤할 수 있습니다.
  • multi_compile_instancing은 인스턴싱에 관련된 키워드를 추가합니다. 셰이더가 절차적 인스턴싱을 사용하는 경우 이 단축키는 INSTANCING_ON PROCEDURAL_ON 키워드 세트를 추가합니다. 이외의 경우에는 INSTANCING_ON 키워드를 추가합니다. 또한 이러한 키워드 없이도 배리언트를 컴파일합니다. Graphics settings 창에서 이 동작을 컨트롤할 수 있습니다.
HLSL로 그래픽스 API 및 플랫폼 타게팅
셰이더 시맨틱