#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는 셰이더를 컴파일할 때 경고 메시지를 표시하여 이러한 요구 사항을 추가했음을 나타냅니다. 이 경고 메시지가 표시되지 않게 하려면 요구 사항을 명시적으로 추가하거나 코드에서 적절한 타겟 값을 사용하십시오.
필수 기능을 지정하려면 예를 들어 다음과 같이 #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
의 키워드를 지정할 때는 콜론을 사용하지 않습니다.
다음은 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
|
콘솔 플랫폼의 셰이더 모델 지원에 대한 내용은 각 플랫폼의 문서를 참조하십시오.
참고:
mrt8
을 포함하며, 셰이더 모델 5.0은 interpolators32
및 cubearray
를 포함합니다. Unity는 보다 폭넓은 호환성을 위해 이러한 기능을 포함하지 않습니다. 이러한 기능을 요구하려면 명시적인 #pragma require
지시문을 사용하십시오.geometry
를 요구하는 타겟을 사용하지만 셰이더가 지오메트리 단계를 정의하지 않는 경우, Unity는 컴파일 시 요구 사항 리스트에서 geometry
를 제거합니다.tessellation
을 요구하는 타겟을 사용하지만 셰이더가 헐 또는 도메인 단계를 정의하지 않는 경우, Unity는 컴파일 시 요구 사항 리스트에서 tessellation
을 제거합니다.다음은 #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 기능을 타겟팅할 수 있습니다.
다음 구문을 사용합니다.
# 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에서 셰이더 키워드 선언 및 사용을 참조하십시오.