#pragma 지시문을 사용하여 셰이더가 특정 GPU 기능을 필요로 한다는 사실을 나타낼 수 있습니다. 런타임 시 Unity는 이 정보를 사용하여 셰이더 프로그램이 현재 하드웨어와 호환되는지 확인합니다.
#pragma require 지시문으로 개별 GPU 기능을 지정하거나, #pragma target 지시문으로 셰이더 모델을 지정할 수 있습니다. 셰이더 모델은 GPU 기능을 하나로 묶어 표현하는 약칭으로, 내부적으로는 동일한 기능 리스트를 가진 #pragma require 지시문과 동일합니다.
셰이더에 필요한 GPU 기능을 올바르게 설명하는 것이 중요합니다. 셰이더가 요구 사항 리스트에 포함되지 않은 기능을 사용하는 경우, 컴파일 시간 오류가 발생하거나 기기가 런타임 시 셰이더를 지원하지 못할 수 있습니다.
기본적으로 Unity는 #pragma target 2.5에 해당하는 #pragma require derivatives로 셰이더를 컴파일합니다.
셰이더가 특정한 셰이더 단계를 정의하는 경우, Unity는 요구 사항 리스트에 자동으로 항목을 추가합니다.
#pragma geometry로) 지오메트리 단계를 정의하는 경우, Unity는 요구 사항 리스트에 자동으로 geometry를 추가합니다.#pragma hull 또는 #pragma domain으로) 테셀레이션 단계를 정의하는 경우, Unity는 요구 사항 리스트에 자동으로 tessellation을 추가합니다.요구 사항 리스트(또는 동등한 타겟 값)에 이러한 값이 아직 포함되어 있지 않은 경우, Unity는 셰이더를 컴파일할 때 경고 메시지를 표시하여 이러한 요구 사항을 추가했음을 나타냅니다. 이 경고 메시지가 표시되지 않도록 하려면 요구 사항을 명시적으로 추가하거나 코드에 적절한 타겟 값을 사용하십시오.
필수 기능을 지정하려면 다음과 같이 #pragma require 지시문 뒤에 공백으로 구분된 값 리스트를 사용하십시오. 예시:
#pragma require integers mrt8
#pragma require 지시문 뒤에 콜론과 공백으로 구분된 셰이더 키워드 리스트를 사용할 수도 있습니다. 그러면 지정된 키워드가 활성화된 경우 사용되는 배리언트에만 요구 사항이 적용됩니다.
예시:
#pragma require integers mrt8 : EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD
여러 #pragma require 라인을 사용할 수 있습니다. 이 예시에서 셰이더는 모든 경우에 integers를 요구하고 EXAMPLE_KEYWORD가 활성화된 경우에는 mrt8을 요구합니다.
#pragma require integers
#pragma require integers mrt8 : EXAMPLE_KEYWORD
셰이더 모델을 지정하려면 #pragma target 지시문을 사용합니다. 예시:
#pragma target 4.0
#pragma target 지시문 뒤에 스페이스로 구분된 셰이더 키워드 리스트를 사용할 수도 있습니다. 그러면 지정된 키워드가 활성화된 경우 사용되는 배리언트에만 요구 사항이 적용됩니다.
예시:
#pragma target 4.0 EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD
참고: #pragma require 및 #pragma target에 대한 키워드 지정 구문은 약간 다릅니다. #pragma require에 대한 키워드를 지정할 때는 콜론을 사용합니다. #pragma target에 대한 키워드를 지정할 때는 콜론을 사용하지 않습니다.
참고: 다음 셰이더 키워드를 사용하는 경우 Unity는 DXC 컴파일러를 사용하여 셰이더를 컴파일합니다. Unity에서의 DXC 지원은 실험 단계이며 모든 플랫폼에서 지원되지 않고 정식 제작에 사용할 준비가 되지 않았습니다.
DX12(DirectX12), Vulkan, Metal 그래픽스 API를 사용하는 경우 셰이더 키워드를 사용하여 다음 GPU 기능을 타게팅할 수 있습니다.
다음 구문을 사용합니다.
#pragma multi_compile _ <keyword>
pragma require 지시문을 추가할 필요가 없습니다.
그런 다음 Unity가 다음을 수행합니다.
#if 문을 사용하여 셰이더 코드의 일부를 GPU가 기능을 지원하는지 여부에 따라 조건부로 만들 수 있습니다.
멀티 컴파일 키워드|GPU 기능|조건부 셰이더 코드용 키워드 -|-|- UNITY_DEVICE_SUPPORTS_NATIVE_16BIT|16비트 데이터 유형을 지원합니다. 이 키워드를 사용하면 half 및 min16float 같은 데이터 유형이 16비트로 변환되므로 셰이더 버퍼의 레이아웃이 변경될 수 있습니다. |UNITY_DEVICE_SUPPORTS_NATIVE_16BIT UNITY_DEVICE_SUPPORTS_WAVE_ANY|모든 크기의 웨이브 연산을 지원합니다. 웨이브 크기가 중요하지 않은 웨이브 연산을 사용하는 경우에만 이 키워드를 사용합니다.|UNITY_HW_SUPPORTS_WAVE UNITY_DEVICE_SUPPORTS_WAVE_8|웨이브 크기가 8인 웨이브 연산을 지원합니다.|UNITY_HW_SUPPORTS_WAVE UNITY_DEVICE_SUPPORTS_WAVE_16|웨이브 크기가 16인 웨이브 연산을 지원합니다.|UNITY_HW_SUPPORTS_WAVE UNITY_DEVICE_SUPPORTS_WAVE_32|웨이브 크기가 32인 웨이브 연산을 지원합니다.|UNITY_HW_SUPPORTS_WAVE UNITY_DEVICE_SUPPORTS_WAVE_64|웨이브 크기가 64인 웨이브 연산을 지원합니다.|UNITY_HW_SUPPORTS_WAVE UNITY_DEVICE_SUPPORTS_WAVE_128|웨이브 크기가 128인 웨이브 연산을 지원합니다.|UNITY_HW_SUPPORTS_WAVE
특정 웨이브 크기를 타게팅하는 키워드를 사용하는 경우 Unity는 UNITY_HW_WAVE_SIZE 정의를 동일한 웨이브 크기로 설정하여 셰이더 코드에서 사용할 수 있도록 합니다.
자세한 내용은 HLSL에서 셰이더 키워드 선언 및 사용을 참조하십시오.