Version: 2020.3
언어: 한국어
Unity의 HLSL
셰이더 컴파일: 셰이더 모델 및 GPU 기능 타게팅

셰이더 컴파일: pragma 지시문

HLSL에서 프리 프로세서 지시문을 사용하여 컴파일러에 셰이더 프로그램을 컴파일하는 방법을 지시할 수 있습니다. Pragma 지시문은 프리 프로세서 지시문의 한 타입입니다. 이 페이지에는 셰이더 소스 코드에서 사용할 수 있는 pragma 지시문에 대한 정보가 포함되어 있습니다.

HLSL의 프리 프로세서 지시문에 대한 일반적인 정보의 경우 Microsoft 문서인 전처리기 지시문(HLSL)을 참조하십시오.

pragma 지시문 사용

셰이더 소스 파일의 HLSL 코드 블록 안에 pragma 지시문을 넣습니다.

기본적으로 Unity는 첨부 파일에 pragma 지시문을 지원하지 않습니다. 에디터 설정에서 캐싱 프리 프로세서를 활성화하려면 #include_with_pragmas 프리 프로세서 지시문을 사용할 수 있습니다. 이 지시문을 사용하면 첨부 파일에 pragma 지시문을 넣을 수 있습니다. 이는 여러 파일에 대한 셰이더 디버그 심볼을 활성화하거나 비활성화하는 경우에 특히 유용할 수 있습니다.

지원되는 pragma 지시문

셰이더 단계

이러한 pragma 지시문을 사용하여 다른 셰이더 단계로서 컴파일할 셰이더 코드 부분을 컴파일러에 알립니다.

HLSL 스니핏은 최소한 하나의 버텍스 프로그램과 하나의 프래그먼트 프로그램을 포함해야 합니다. 따라서 #pragma vertex#pragma fragment 지시문이 필요합니다.

상태 기능
#pragma vertex name name 함수를 버텍스 셰이더로 컴파일합니다.
#pragma fragment name name 함수를 프래그먼트 셰이더로 컴파일합니다.
#pragma geometry name name 함수를 DX10 지오메트리 셰이더로 컴파일합니다. 이 옵션은 아래 표에 설명된 대로 #pragma target 4.0을 자동으로 활성화합니다.
#pragma hull name name 함수를 DX11 헐 셰이더로 컴파일합니다. 이 옵션은 아래 표에 설명된 대로 #pragma target 5.0을 자동으로 활성화합니다.
#pragma domain name name 함수를 DX11 도메인 셰이더로 컴파일합니다. 이 옵션은 아래 표에 설명된 대로 #pragma target 5.0을 자동으로 활성화합니다.

셰이더 배리언트 및 키워드

이러한 pragma 지시문을 사용하여 셰이더 배리언트 및 키워드를 처리하는 방식을 셰이더 컴파일러에 알립니다.

상태 기능
#pragma multi_compile ... 특정 키워드에 대한 셰이더 배리언트를 생성합니다. Multi_compile 셰이더의 사용하지 않은 배리언트는 게임 빌드에 포함됩니다. 자세한 내용은 셰이더 배리언트 및 키워드를 참조하십시오.
#pragma multi_compile_local ... 이 구문은 multi_compile과 유사하지만 열거된 키워드가 로컬입니다. 자세한 내용은 셰이더 배리언트 및 키워드를 참조하십시오.
#pragma shader_feature ... 특정 키워드에 대한 셰이더 배리언트를 생성합니다. shader_feature 셰이더의 사용하지 않은 배리언트는 게임 빌드에 포함되지 않습니다. 자세한 내용은 셰이더 배리언트 및 키워드를 참조하십시오.
#pragma shader_feature_local ... 이 구문은 shader_feature과 유사하지만 열거된 키워드가 로컬입니다. 자세한 내용은 셰이더 배리언트 및 키워드를 참조하십시오.

셰이더 모델 및 GPU 기능

이러한 pragma 지시문을 사용하여 셰이더가 특정한 셰이더 모델을 타겟으로 삼거나 셰이더에 특정 GPU 기능이 필요하다는 사실을 컴파일러에 전달하십시오.

상태 기능
#pragma target name 이 셰이더 프로그램을 컴파일할 셰이더 모델입니다. 자세한 내용은 셰이더 컴파일: 셰이더 모델 및 GPU 기능 타게팅을 참조하십시오.
#pragma require feature ... 이 셰이더 프로그램에 필요한 GPU 기능입니다. 자세한 내용은 셰이더 컴파일: 셰이더 모델 및 GPU 기능 타게팅을 참조하십시오.

그래픽스 API

이러한 pragma 지시문을 사용하여 특정 그래픽스 API용 셰이더를 컴파일하도록 컴파일러에 알립니다.

상태 기능
#pragma only_renderers space separated names 특정 그래픽스 API용으로만 이 셰이더 프로그램을 컴파일합니다. 자세한 내용은 셰이더 컴파일: 그래픽스 API 타게팅을 참조하십시오.
#pragma exclude_renderers space separated names 이 셰이더 프로그램을 특정 그래픽스 API용으로 컴파일하지 않습니다. 자세한 내용은 셰이더 컴파일: 그래픽스 API 타게팅을 참조하십시오.

기타 pragma 지시문

상태 기능
#pragma enable_d3d11_debug_symbols 셰이더 디버그 심볼을 생성합니다. 그리고/또는 최적화를 비활성화합니다. 외부 툴에서 셰이더 코드를 디버깅하는 데 이 pragma 지시문을 사용합니다.

Vulkan과 DirectX 11, DirectX 12, 지원되는 콘솔 플랫폼의 경우 Unity는 디버그 심볼을 생성하고 최적화를 비활성화합니다.

Metal과 OpenGL의 경우 이미 기본적으로 셰이더를 디버그할 수 있습니다. 이 pragma 지시문을 사용하면 Unity는 최적화를 비활성화합니다.

경고: 이 지시문을 사용하면 파일 크기가 증가하고 셰이더 성능이 줄어듭니다. 셰이더 디버깅을 완료하고 애플리케이션의 최종 빌드를 만들 준비가 되면 셰이더 소스 코드에서 이 줄을 삭제하고 셰이더를 다시 컴파일하십시오.
#pragma hardware_tier_variants renderer name 선택한 렌더러를 실행할 수 있는 각 하드웨어 티어에 대해 시스템이 컴파일하는 각 셰이더의 여러 셰이더 하드웨어 배리언트를 생성합니다.
이 구문은 빌트인 렌더 파이프라인에서만 지원됩니다.
#pragma hlslcc_bytecode_disassembly 디스어셈블된 HLSLcc 바이트코드를 변환된 셰이더에 포함합니다.
#pragma disable_fastmath 정확한 IEEE 754 규칙을 활성화하며, NaN 처리를 포함합니다. 현재에는 Metal 플랫폼에만 영향을 줍니다.
#pragma glsl_es2 GLSL 셰이더에서 설정하면 셰이더 타겟이 OpenGL ES 3인 경우에도 GLSL ES 1.0(OpenGL ES 2.0)을 생성합니다.
#pragma editor_sync_compilation 동기 컴파일을 강제합니다. Unity 에디터에만 영향을 미칩니다. 자세한 내용은 비동기 셰이더 컴파일을 참조하십시오.
#pragma enable_cbuffer HLSLSupport의 CBUFFER_START(name)CBUFFER_END 매크로를 사용할 때 cbuffer(name)을 방출합니다. 이는 현재 플랫폼이 상수 버퍼를 지원하지 않더라도 마찬가지입니다.

사용하지 않은 pragma 지시문

다음 컴파일 지시문은 아무 동작도 수행하지 않으며 안전하게 제거할 수 있습니다.

  • #pragma glsl
  • #pragma glsl_no_auto_normalization
  • #pragma profileoption
  • #pragma fragmentoption
Unity의 HLSL
셰이더 컴파일: 셰이더 모델 및 GPU 기능 타게팅