키워드를 활성화하거나 비활성화할 때 셰이더가 다르게 작동하도록 셰이더 키워드를 선언할 수 있습니다.
표면 셰이더와 컴퓨트 셰이더를 비롯한 일반 그래픽스 셰이더에서 셰이더 키워드를 선언할 수 있습니다.
셰이더 키워드를 선언하려면 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_branch
와 shader_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_compile
을 shader_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에 따라 다르게 동작하거나 영향을 미치지 않을 수 있습니다.
_geometry
및 _raytracing
접미사는 Metal에 영향을 미치지 않으며, Metal은 _vertex
, _hull
, _domain
을 하나의 단계로 취급합니다.키워드를 #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_DEPTH
및 SHADOWS_CUBE
배리언트를 추가하는 방법에 대해 설명합니다.
# pragma multi_compile_shadowcaster
skip_variants
를 사용하여 필요하지 않은 키워드를 제거할 수 있습니다.예를 들어 Unity가 multi_compile_fwdadd
에서 배리언트를 생성할 때 다음을 사용하여 POINT
및 POINT_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.LightPrePassFinal과 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 창에서 이 동작을 컨트롤할 수 있습니다.