Version: 2023.2
언어: 한국어
HLSL에서 셰이더 컴파일러에 정보 제공
HLSL로 그래픽스 API 및 플랫폼 타게팅

HLSL로 셰이더 모델 및 GPU 기능 타게팅

#pragma 지시문을 사용하여 셰이더가 특정한 GPU 기능을 요구함을 나타낼 수 있습니다. 런타임 시 Unity는 이 정보를 사용하여 셰이더 프로그램이 현재 하드웨어와 호환되는지 여부를 파악합니다.

#pragma require 지시문으로 개별 GPU 기능을 지정하거나, #pragma target 지시문으로 셰이더 모델을 지정할 수 있습니다. 셰이더 모델은 여러 GPU 기능의 단축이며, 내부적으로는 같은 기능 리스트가 있는 #pragma require 지시문과 동일합니다.

셰이더가 필요로 하는 GPU 기능을 올바르게 설명하는 것이 중요합니다. 셰이더가 요구 사항 리스트에 포함되지 않은 기능을 사용하는 경우, 컴파일 시간 오류가 발생하거나 기기가 런타임 시 셰이더를 지원하지 못할 수 있습니다.

기본 동작

기본적으로 Unity는 #pragma require derivatives로 셰이더를 컴파일합니다. 이는 #pragma target 2.5에 해당합니다.

셰이더 단계를 위한 특수 요구 사항

셰이더가 특정한 셰이더 단계를 정의하는 경우, Unity는 요구 사항 리스트에 자동으로 항목을 추가합니다.

  • 셰이더가 지오메트리 단계를 정의하는 경우(#pragma geometry로), Unity는 요구 사항 리스트에 자동으로 geometry를 추가합니다.
  • 셰이더가 테셀레이션 단계를 정의하는 경우(#pragma hull 또는 #pragma domain으로), Unity는 요구 사항 리스트에 자동으로 tessellation을 추가합니다.

요구 사항 리스트(또는 동등한 타겟 값)가 이러한 값을 이미 포함하지 않는 경우, Unity는 셰이더를 컴파일할 때 경고 메시지를 표시하여 이러한 요구 사항을 추가했음을 나타냅니다. 이 경고 메시지가 표시되지 않게 하려면 요구 사항을 명시적으로 추가하거나 코드에서 적절한 타겟 값을 사용하십시오.

GPU 기능 또는 셰이더 모델 지정

필수 기능을 지정하려면 예를 들어 다음과 같이 #pragma require 지시문과 함께 공백으로 구분된 값 리스트를 사용하십시오.

# pragma require integers mrt8

#pragma require 지시문과 함께 콜론과 공백으로 구분된 셰이더 키워드 리스트를 사용할 수도 있습니다. 이는 해당 요구 사항이 주어진 키워드가 활성화된 경우에 사용되는 배리언트에만 적용됨을 나타냅니다.

예제:

# pragma require integers mrt8 : EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD

여러 개의 #pragma require 줄을 사용할 수 있습니다. 이 예제에서는 셰이더가 모든 경우에 integers를 요구하며, mrt8 if EXAMPLE_KEYWORD가 활성화되었습니다.

# 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의 키워드를 지정할 때는 콜론을 사용하지 않습니다.

‘#pragma target’ 값 리스트

다음은 Unity가 사용하는 셰이더 모델의 리스트와, 각 셰이더 모델이 상응하는 #pragma require 값의 조합입니다.

참고: Unity의 셰이더 모델은 DirextX 셰이더 모델 및 OpenGL 버전 요구 사항과 비슷하나, 정확히 상응하지는 않습니다. 설명을 잘 읽고 그 차이점을 이해하십시오.

설명 지원 동등한 #pragma require
2.0 DirectX 셰이더 모델 2.0과 동등합니다.

연산 및 텍스처 명령어 수가 제한됩니다. 인터폴레이터 8개, 버텍스 텍스처 샘플링 없음, 프래그먼트 셰이더에 도함수 없음, 명시적 LOD 텍스처 샘플링 없음.
Unity가 지원하는 모든 플랫폼에서 작동합니다. 해당 없음
2.5 3.0과 거의 동일하지만, 인터폴레이터가 8개뿐이며 명시적인 LOD 텍스처 샘플링이 없습니다. DirectX 11 기능 레벨 9+
OpenGL 3.2+
Vulkan
Metal
derivatives
3.0 DirectX 셰이더 모델 3.0과 동등합니다.

.
DirectX 11 기능 레벨 10 +
OpenGL 3.2+
OpenGL ES 3.0+
Vulkan
Metal
2.5의 모든 사항 및:
interpolators10 samplelod fragcoord
3.5 OpenGL ES 3.0과 동등합니다.

DirectX 11 기능 레벨 10+
OpenGL 3.2+
OpenGL ES 3+
Vulkan
Metal
3.0의 모든 사항 및:
interpolators15 mrt4 integers 2darray instancing
4.0 DirectX 셰이더 모델 4.0과 동등하지만, 8개의 MRT를 지원해야 하는 요구 사항이 없습니다. DirectX 11 기능 레벨 10+
OpenGL 3.2+
OpenGL ES 3.1+AEP
Vulkan
Metal(지오메트리 단계가 정의되지 않은 경우)
3.5의 모든 사항 및:
geometry
4.5 OpenGL ES 3.1과 동등합니다. DirectX 11 기능 레벨 11+
OpenGL 4.3+
OpenGL ES 3.1
Vulkan
Metal
3.5의 모든 사항 및:
compute randomwrite msaatex
4.6 OpenGL 4.1과 동등합니다.

Mac에서 지원되는 가장 높은 OpenGL 레벨입니다.
DirectX 11 기능 레벨 11+
OpenGL 4.1+
OpenGL ES 3.1+AEP
Vulkan
Metal(지오메트리 단계가 정의되지 않았으며, 헐 또는 도메인 단계가 정의되지 않은 경우)
4.0의 모든 사항 및:
cubearray tesshw tessellation msaatex
5.0 DirectX 셰이더 모델 5.0과 동등하지만, 인터폴레이터 32개 또는 큐브맵 배열을 지원해야 하는 요구 사항이 없습니다. DirectX 11 기능 레벨 11+
OpenGL 4.3+
OpenGL ES 3.1+AEP
Vulkan
Metal(지오메트리 단계가 정의되지 않았으며, 헐 또는 도메인 단계가 정의되지 않은 경우)
4.0의 모든 사항 및:
compute randomwrite msaatex tesshw tessellation

콘솔 플랫폼의 셰이더 모델 지원에 대한 내용은 각 플랫폼의 문서를 참조하십시오.

참고:

  • DirectX 정의에서 셰이더 모델 4.0은 mrt8을 포함하며, 셰이더 모델 5.0은 interpolators32cubearray를 포함합니다. Unity는 보다 폭넓은 호환성을 위해 이러한 기능을 포함하지 않습니다. 이러한 기능을 요구하려면 명시적인 #pragma require 지시문을 사용하십시오.
  • geometry를 요구하는 타겟을 사용하지만 셰이더가 지오메트리 단계를 정의하지 않는 경우, Unity는 컴파일 시 요구 사항 리스트에서 geometry를 제거합니다.
  • tessellation을 요구하는 타겟을 사용하지만 셰이더가 헐 또는 도메인 단계를 정의하지 않는 경우, Unity는 컴파일 시 요구 사항 리스트에서 tessellation을 제거합니다.

‘#pragma require’ 값 리스트

다음은 #pragma require 지시문에 대해 유효한 모든 값입니다.

설명
interpolators10 버텍스에서 프래그먼트로 넘기는 인터폴레이터(“varyings”)가 10가지 이상 지원됩니다.
interpolators15 버텍스에서 프래그먼트로 넘기는 인터폴레이터(“varyings”)가 15가지 이상 지원됩니다.

참고: 또한 내부적으로 이 값은 요구 사항 리스트에 integers를 자동으로 추가합니다.
interpolators32 버텍스에서 프래그먼트로 넘기는 인터폴레이터(“varyings”)가 32가지 이상 지원됩니다.
integers 정수는 지원되는 데이터 타입으로, 비트/시프트 연산을 포함합니다.

참고: 또한 내부적으로 이 값은 요구 사항 리스트에 interpolators15를 자동으로 추가합니다.
mrt4 최소한 4개의 렌더 타겟이 지원됩니다.
mrt8 최소한 8개의 렌더 타겟이 지원됩니다.
derivatives 픽셀 셰이더 도함수 명령어(ddx/ddy)가 지원됩니다.
samplelod 명시적 텍스처 LOD 샘플링(tex2Dlod / SampleLevel)이 지원됩니다.
fragcoord 픽셀 셰이더의 픽셀 위치(화면: XY, 클립 공간: ZW 뎁스) 입력이 지원됩니다.
2darray 2D 텍스처 배열은 지원되는 데이터 타입입니다.
cubearray 큐브맵 배열은 지원되는 데이터 타입입니다.
instancing SV_InstanceID 입력 시스템 값이 지원됩니다.
geometry 지오메트리 셰이더 단계가 지원됩니다.
compute 컴퓨트 셰이더, 구조화된 버퍼 및 원자 연산이 지원됩니다.
randomwrite 또는 uav “Random write”(UAV) 텍스처가 지원됩니다.
tesshw 하드웨어 테셀레이션은 지원되나, 테셀레이션(헐/도메인) 셰이더 단계는 지원되지 않을 수도 있습니다. 예를 들어 Metal은 테셀레이션을 지원하지만, 헐 또는 도메인 단계는 지원하지 않습니다.
tessellation 테셀레이션(헐/도메인) 셰이더 단계가 지원됩니다.
msaatex 멀티 샘플 텍스처에 액세스하는 기능(HLSL의 Texture2DMS)이 지원됩니다.
sparsetex 상주성 정보가 있는 스파스 텍스처(*DirectX에서 “Tier2” 지원, CheckAccessFullyMapped HLSL 함수)입니다.
framebufferfetch 또는 fbfetch Framebuffer 페치( 픽셀 셰이더에서 입력 픽셀 컬러를 읽을 수 있음)가 지원됩니다.
setrtarrayindexfromanyshader 지오메트리 셰이더 단계뿐 아니라 모든 셰이더 단계에서 렌더 타겟 배열 인덱스를 설정하는 기능이 지원됩니다.
inlineraytracing 인라인 레이트레이싱이 지원되므로 셰이더의 래스터화 및 계산 단계에서 레이 쿼리를 생성할 수 있습니다. 자세한 내용은 SystemInfo.supportsInlineRayTracing을 참조하십시오.

셰이더 키워드를 사용하여 GPU 기능 타겟팅

셰이더 키워드를 사용하여 다음 GPU 기능을 타겟팅할 수 있습니다.

다음 구문을 사용합니다.

# pragma multi_compile _ <keyword>

pragma require 지시문을 추가하지 않아도 됩니다.

그런 다음 Unity는 다음을 수행합니다.

  • 호환되는 셰이더 컴파일러를 사용하고 해당 기능과 관련된 컴파일러 플래그를 활성화합니다.
  • 키워드가 켜저 있는 셰이더 배리언트와 키워드가 꺼져 있는 셰이더 배리언트를 모두 자동으로 컴파일합니다.
  • 런타임 시 하드웨어가 해당 기능을 지원하는지 자동으로 확인하고 올바른 배리언트를 선택합니다.

#if 문을 사용하여 셰이더 코드의 일부를 GPU의 기능 지원 여부에 따라 조건부로 만들 수 있습니다.

키워드

멀티 컴파일 키워드 GPU 기능 조건부 셰이더 코드용 키워드
UNITY_DEVICE_SUPPORTS_NATIVE_16BIT 16비트 데이터 타입을 지원합니다. 이 키워드를 사용하면 halfmin16float와 같은 데이터 타입이 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에서 셰이더 키워드 선언 및 사용을 참조하십시오.

HLSL에서 셰이더 컴파일러에 정보 제공
HLSL로 그래픽스 API 및 플랫폼 타게팅