#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+ OpenGL ES 2.0 Vulkan Metal |
derivatives |
3.0 |
DirectX 셰이더 모델 3.0과 동등합니다. . |
DirectX 11 기능 레벨 10 + OpenGL 3.2+ OpenGL ES 3.0+ Vulkan Metal 드라이버 확장자 및 기능에 따라 일부 OpenGL ES 2.0 기기에서 작동할 수 있습니다. |
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 |
지오메트리 셰이더 단계뿐 아니라 모든 셰이더 단계에서 렌더 타겟 배열 인덱스를 설정하는 기능이 지원됩니다. |
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.