Version: 2021.2
언어: 한국어
HLSL의 include 및 include_with_pragmas 지시문
HLSL로 셰이더 모델 및 GPU 기능 타게팅

HLSL의 pragma 지시문

HLSL에서 #pragma 지시문은 프리 프로세서 지시문의 일종입니다. 이러한 지시문은 다른 타입의 프리 프로세서 지시문은 다루지 않는 추가 정보를 셰이더 컴파일러에 제공합니다.

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 매크로
  • Unity 전용 #pragma 지시문은 .shader 파일 및 #include_with_pragmas 지시문에 포함한 파일에서만 사용할 수 있습니다. Unity는 #include 지시문에 포함한 파일에서는 Unity 전용 #pragma 지시문을 지원하지 않습니다(컴파일러가 무시함).
  • 표준 HLSL #pragma 지시문은 #include 지시문에 포함한 파일에서만 사용할 수 있습니다. Unity는 shader 파일 또는 #include_with_pragmas 지시문에 포함한 파일에서는 표준 HLSL #pragma 지시문을 지원하지 않습니다(컴파일러가 무시함).

캐시 셰이더 프리 프로세서가 비활성화된 경우:

  • Unity는 조건부 (#if) 지시문에서 #pragma 지시문을 지원하지 않습니다(컴파일러가 무시함).
  • Unity 전용 #pragma 지시문은 .shader 파일에서만 사용할 수 있습니다. Unity는 #include 지시문에 포함한 파일에서는 Unity 전용 #pragma 지시문을 지원하지 않습니다(컴파일러가 무시함).
  • 표준 HLSL #pragma 지시문은 #include 지시문에 포함한 파일에서만 사용할 수 있습니다. Unity는 shader 파일에서는 표준 HLSL #pragma 지시문을 지원하지 않습니다(컴파일러가 무시함).

지원되는 pragma 지시문 리스트

Unity는 표준 HLSL의 일부인 #pragma 지시문을 해당 지시문이 일반 include 파일 내에 있는 한 모두 지원합니다. 이러한 지시문에 대해 자세히 알아보려면 HLSL에 관한 문서인 pragma 지시문을 참조하십시오.

또한 Unity는 다음의 Unity 전용 #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 요구 사항 및 셰이더 모델 지원

이러한 지시문을 사용하여 셰이더가 특정한 GPU 기능을 필요로 한다는 사실을 컴파일러에 전달하십시오.

상태 기능
#pragma target <value> 이 셰이더 프로그램과 호환되는 최소한의 셰이더 모델입니다. <value>를 유효한 값으로 대체하십시오. 유효한 값의 리스트는 셰이더 컴파일: HLSL로 셰이더 모델 및 GPU 기능 타게팅을 참조하십시오.
#pragma require <value> 이 셰이더 프로그램과 호환되는 최소한의 GPU 기능입니다. <value>를 유효한 값이나 여러 개의 유효한 값(공백으로 구분)으로 대체하십시오. 유효한 값의 리스트는 셰이더 컴파일: HLSL로 셰이더 모델 및 GPU 기능 타게팅을 참조하십시오.

그래픽스 API

이러한 지시문을 사용하여 Unity에 특정한 그래픽스 API에 대해 코드를 포함하거나 제외할 것을 전달하십시오.

상태 기능
#pragma only_renderers <value> 특정 그래픽스 API에 대해서만 이 셰이더 프로그램을 컴파일합니다. <values>를 공백으로 구분된 유효한 값의 리스트로 대체하십시오. 자세한 내용 및 유효한 값의 리스트는 HLSL로 그래픽스 API 및 플랫폼 타게팅을 참조하십시오.
#pragma exclude_renderers <value> 특정 그래픽스 API에 대해 이 셰이더 프로그램을 컴파일하지 않습니다. <values>를 공백으로 구분된 유효한 값의 리스트로 대체하십시오. 자세한 내용 및 유효한 값의 리스트는 HLSL로 그래픽스 API 및 플랫폼 타게팅을 참조하십시오.

기타 pragma 지시문

상태 기능
#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)을 방출합니다. 이는 현재 플랫폼이 상수 버퍼를 지원하지 않더라도 마찬가지입니다.
HLSL의 include 및 include_with_pragmas 지시문
HLSL로 셰이더 모델 및 GPU 기능 타게팅