HLSL에서 다음 프로세서 지시문 타입을 사용하여 셰이더 컴파일러에 정보를 제공할 수 있습니다.
#pragma
#define_for_platform_compiler
#pragma
지시문은 다른 타입의 프리 프로세서 지시문에서 다루지 않는 추가 정보를 셰이더 컴파일러에 제공합니다.
#pragma
지시문을 HLSL 코드의 원하는 부분에 삽입할 수 있지만, 일반적으로 다음과 같이 시작 부분에 삽입합니다.
# pragma target 3.0
# pragma exclude_renderers vulkan
# pragma vertex vert
# pragma fragment frag
// The rest of your HLSL code goes here
#Pragma
지시문을 사용하는 데는 다음과 같은 몇 가지 제약이 있습니다.
#if
) 지시문 내에서 #pragma
지시문을 사용할 수 있습니다.
#define
지시문SHADER_API_MOBILE
, SHADER_API_DESKTOP
, UNITY_NO_RGBM
, UNITY_USE_NATIVE_HDR
, UNITY_FRAMEBUFFER_FETCH_AVAILABLE
, UNITY_NO_CUBEMAP_ARRAY
UNITY_VERSION
매크로#pragma
지시문은 .shader
파일 및 #include_with_pragmas
지시문에 포함한 파일에서만 사용할 수 있습니다. Unity는 #include
지시문에 포함한 파일에서는 Unity 전용 #pragma
지시문을 지원하지 않습니다(컴파일러가 무시함).#pragma
지시문은 #include
지시문에 포함한 파일에서만 사용할 수 있습니다. Unity는 shader
파일 또는 #include_with_pragmas
지시문에 포함한 파일에서는 표준 HLSL #pragma
지시문을 지원하지 않습니다(컴파일러가 무시함).Unity는 표준 HLSL의 일부인 #pragma
지시문을 해당 지시문이 일반 include 파일 내에 있는 한 모두 지원합니다. 이러한 지시문에 대해 자세히 알아보려면 HLSL에 관한 문서인 pragma 지시문을 참조하십시오.
표면 셰이더를 사용하는 경우, 이 지시문을 사용하여 컴파일러에 표면 함수로 사용할 함수를 지시하고 해당 함수로 데이터를 전달하십시오.
상태 | 기능 |
---|---|
#pragma surface <surface function> <lighting model> <optional parameters> |
특정 조명 모델과 함께 작동하도록 특정한 이름의 함수를 표면 셰이더로 컴파일합니다. 자세한 내용은 표면 셰이더를 참조하십시오. |
일반 그래픽스 셰이더를 작성하는 경우, 다음 지시문을 사용하여 여러 셰이더 단계에 사용할 함수를 컴파일에 지시하십시오. #pragma vertex
및 #pragma fragment
지시문은 필수이나, 여타 단계는 선택 사항입니다.
상태 | 기능 |
---|---|
#pragma vertex <name> |
특정한 이름의 함수를 버텍스 셰이더로 컴파일합니다. <name>을 함수 이름으로 대체하십시오. 이 지시문은 일반 그래픽스 셰이더에서 필수입니다. |
#pragma fragment <name> |
특정한 이름의 함수를 프래그먼트 셰이더로 컴파일합니다. <name>을 함수 이름으로 대체하십시오. 이 지시문은 일반 그래픽스 셰이더에서 필수입니다. |
#pragma geometry <name> |
특정한 이름의 함수를 지오메트리 셰이더로 컴파일합니다. <name>을 함수 이름으로 대체하십시오. 이 옵션은 #pragma require geometry 를 자동으로 활성화합니다. 자세한 내용은 HLSL로 셰이더 모델 및 GPU 기능 타게팅을 참조하십시오.참고: Metal은 지오메트리 셰이더를 지원하지 않습니다. |
#pragma hull <name> |
특정한 이름의 함수를 DirectX 11 헐 셰이더로 컴파일합니다. <name>을 함수 이름으로 대체하십시오. 이 옵션은 #pragma require tessellation 을 자동으로 추가합니다. 자세한 내용은 HLSL로 셰이더 모델 및 GPU 기능 타게팅을 참조하십시오. |
#pragma domain <name> |
특정한 이름의 함수를 DirectX 11 도메인 셰이더로 컴파일합니다. <name>을 함수 이름으로 대체하십시오. 이 옵션은 #pragma require tessellation 을 자동으로 활성화합니다. 자세한 내용은 HLSL로 셰이더 모델 및 GPU 기능 타게팅을 참조하십시오. |
이러한 지시문을 사용하여 셰이더 컴파일러에 셰이더 배리언트 및 키워드를 처리하는 방법을 지시하십시오. 자세한 내용은 HLSL로 셰이더 키워드 선언 및 사용을 참조하십시오.
지시문 | 설명 |
---|---|
#pragma multi_compile <keywords> |
키워드 컬렉션을 선언합니다. 컴파일러가 빌드에 모든 키워드를 포함합니다._local 과 같은 접미사를 사용할 수 있습니다.자세한 내용 및 지원되는 접미사의 리스트는 HLSL로 셰이더 키워드 선언 및 사용을 참조하십시오. |
#pragma shader_feature <keywords> |
키워드 컬렉션을 선언합니다. 컴파일러가 빌드에서 사용하지 않은 키워드를 제외합니다. 추가 옵션을 설정하기 위해 _local 과 같은 접미사를 사용할 수 있습니다.자세한 내용 및 지원되는 접미사의 리스트는 HLSL로 셰이더 키워드 선언 및 사용을 참조하십시오. |
#pragma hardware_tier_variants <values> |
빌트인 렌더 파이프라인만 해당: 특정 그래픽스 API를 위해 컴파일하는 경우 그래픽스 티어를 위한 키워드를 추가합니다. 자세한 내용은 그래픽스 티어를 참조하십시오. |
#pragma skip_variants <list of keywords> |
지정된 키워드를 스트리핑합니다. |
이러한 지시문을 사용하여 셰이더가 특정한 GPU 기능을 필요로 한다는 사실을 컴파일러에 전달하십시오.
상태 | 기능 |
---|---|
#pragma target <value> |
이 셰이더 프로그램과 호환되는 최소한의 셰이더 모델입니다. <value>를 유효한 값으로 대체하십시오. 유효한 값의 리스트는 셰이더 컴파일: HLSL로 셰이더 모델 및 GPU 기능 타게팅을 참조하십시오. |
#pragma require <value> |
이 셰이더 프로그램과 호환되는 최소한의 GPU 기능입니다. <value>를 유효한 값이나 여러 개의 유효한 값(공백으로 구분)으로 대체하십시오. 유효한 값의 리스트는 셰이더 컴파일: HLSL로 셰이더 모델 및 GPU 기능 타게팅을 참조하십시오. |
이러한 지시문을 사용하여 Unity에 특정한 그래픽스 API에 대해 코드를 포함하거나 제외할 것을 전달하십시오.
상태 | 기능 |
---|---|
#pragma only_renderers <value> |
특정 그래픽스 API에 대해서만 이 셰이더 프로그램을 컴파일합니다. <values>를 공백으로 구분된 유효한 값의 리스트로 대체하십시오. 자세한 내용 및 유효한 값의 리스트는 HLSL로 그래픽스 API 및 플랫폼 타게팅을 참조하십시오. |
#pragma exclude_renderers <value> |
특정 그래픽스 API에 대해 이 셰이더 프로그램을 컴파일하지 않습니다. <values>를 공백으로 구분된 유효한 값의 리스트로 대체하십시오. 자세한 내용 및 유효한 값의 리스트는 HLSL로 그래픽스 API 및 플랫폼 타게팅을 참조하십시오. |
상태 | 기능 |
---|---|
#pragma instancing_options <options> |
특정한 옵션으로 이 셰이더에 GPU 인스턴싱을 활성화합니다. 자세한 내용은 GPU 인스턴싱을 참조하십시오. |
#pragma once |
이 지시문을 파일에 삽입하여 컴파일러가 셰이더 프로그램에 파일을 한 번만 포함하게 합니다. 참고: Unity는 캐시 셰이더 프리 프로세서가 활성화된 경우에만 이 지시문을 지원합니다. |
#pragma enable_d3d11_debug_symbols |
지원되는 그래픽스 API를 위한 셰이더 디버그 기호를 생성하고, 모든 그래픽스 API에 대해 최적화를 비활성화합니다. 외부 툴에서 셰이더 코드를 디버그할 때 이 지시문을 사용하십시오. Unity는 Vulkan, DirectX 11과 12 및 지원되는 콘솔 플랫폼을 위한 디버그 기호를 생성합니다. 경고: 이 결과를 사용하면 파일 크기가 커지고 셰이더 성능이 저하됩니다. 셰이더 디버깅을 완료했으며 애플리케이션의 최종 빌드를 만들었으면 셰이더 소스 코드에서 이 줄을 제거하고 셰이더를 재컴파일하십시오. |
#pragma skip_optimizations <value> |
특정 그래픽스 API의 최적화를 강제로 제거합니다. <values>를 공백으로 구분된 유효한 값의 리스트로 대체하십시오. 유효한 값의 리스트는 HLSL로 그래픽스 API 및 플랫폼 타게팅을 참조하십시오. |
#pragma hlslcc_bytecode_disassembly |
디스어셈블된 HLSLcc 바이트코드를 변환된 셰이더에 포함합니다. |
#pragma disable_fastmath |
정확한 IEEE 754 규칙을 활성화하며, NaN 처리를 포함합니다. 현재에는 Metal 플랫폼에만 영향을 줍니다. |
#pragma editor_sync_compilation |
동기 컴파일을 강제합니다. Unity 에디터에만 영향을 미칩니다. 자세한 내용은 비동기 셰이더 컴파일을 참조하십시오. |
#pragma enable_cbuffer |
HLSLSupport의 CBUFFER_START(name) 및 CBUFFER_END 매크로를 사용할 때 cbuffer(name) 을 방출합니다. 이는 현재 플랫폼이 상수 버퍼를 지원하지 않더라도 마찬가지입니다. |
셰이더 코드에서 #define_for_platform_compiler
지시문을 사용하여 #define
지시문을 셰이더 컴파일러로 전송할 수 있습니다.
예를 들어 #define_for_platform_compiler EXAMPLE_SYMBOL
은 #define EXAMPLE_SYMBOL
지시문을 EXAMPLE_SYMBOL
이라는 심볼을 정의하는 셰이더 컴파일러로 전송합니다. 셰이더 컴파일러에서 사용하는 심볼에 대한 자세한 내용은 Microsoft의 FXC 컴파일러 설명서와 같은 외부 셰이더 컴파일러 설명서를 참조하십시오.
Unity 프리 프로세서는 #define_for_platform_compiler
를 사용하여 정의한 심볼을 사용하지 않으므로 셰이더 코드에서 심볼을 사용할 수 없습니다. 예를 들어 위의 예시에서는 셰이더 코드를 #if (EXAMPLE_SYMBOL)
문 안에 추가하면 코드가 실행되지 않습니다.