Version: 2020.3
Shader compilation: pragma directives
Shader compilation: targeting graphics APIs

Shader compilation: targeting shader models and GPU features

In HLSL, shader models are a way of describing the capabilities of a GPU. You can tell Unity to compile shaders for GPUs with certain capabilities, either by specifying the shader model that the GPU must support, or by specifying individual features that the GPU must support.

For general information on shader models in HLSL, see the Microsoft documentation: Shader Models vs Shader Profiles .

Specifying a shader model or GPU feature

To specify a shader model or GPU feature that your Shader object requires, you use pragma directives in your HLSL code. You can indicate the shader model by using the #pragma target name directive, and you can indicate features using the #pragma require feature … directive.

예제:

# pragma target 3.5
# pragma require integers 2darray instancing

For more information on pragma directives, see HLSL pragma directives.

기본 컴파일 타겟

Unity는 기본적으로 지원하는 타겟 중 DirectX 셰이더 모델 2.0과 3.0 사이의 가장 낮은 타겟(“2.5”)으로 셰이더를 컴파일합니다. 일부 다른 컴파일 지시자는 셰이더가 자동으로 더 높은 타겟에서 컴파일되도록 만들수 있습니다.

  • 지오메트리 셰이더를 사용하면(#pragma geometry) 컴파일 타겟을 4.0으로 설정합니다.
  • 테셀레이션 셰이더를 사용하면(#pragma hull 또는 #pragma domain) 컴파일 타겟을 4.6으로 설정합니다.

지오메트리, 헐 또는 도메인 셰이더에 대해 #pragma를 통해 함수 엔트리 포인트를 명시적으로 설정하지 않는 셰이더는 내부 셰이더 성능 요구 사항을 다운그레이드합니다. 이렇게 하면 런타임과 기능에서 큰 차이가 있는 비DX11 타겟이 기존 셰이더 콘텐츠와 호환될 수 있습니다.

예를 들어 Unity는 Metal 그래픽스에 대해 테셀레이션 셰이더를 지원하지만, Metal은 지오메트리 셰이더를 지원하지 않습니다. 지오메트리 셰이더를 사용하지 않는 한 #pragma target 5.0은 계속 사용할 수 있습니다.

지원되는 ’#pragma target’ 이름

아래 리스트는 지원되는 셰이더 모델을 성능의 오름차순으로 나열합니다(일부 경우 더 높은 플랫폼/GPU 요구 사항 순서).

#pragma target 2.0

  • Unity가 지원하는 모든 플랫폼에서 작동합니다. DX9 셰이더 모델 2.0.
  • 연산 및 텍스처 명령어 수가 제한됩니다. 인터폴레이터 8개, 버텍스 텍스처 샘플링 없음, 프래그먼트 셰이더에 도함수 없음, 명시적 LOD 텍스처 샘플링 없음.

#pragma target 2.5(디폴트)

  • 아래의 3.0 타겟과 거의 같으나 인터폴레이터는 8개이고 명시적 LOD 텍스처 샘플링이 없습니다.
  • Windows 휴대폰에서 DX11 기능 레벨 9.3으로 컴파일됩니다.

#pragma target 3.0

  • DX9 셰이더 모델 3.0: 도함수 명령어, 텍스처 LOD 샘플링, 인터폴레이터 10개, 더 많은 수학/텍스처 명령어 허용.
  • DX11 기능 레벨 9.x GPU에서는 지원하지 않습니다(예: 대부분의 Windows 휴대폰 기기).
  • 제공되는 드라이버 확장 및 사용 기능에 따라 일부 OpenGL ES 2.0 기기에서 완전히 지원하지 않을 수 있습니다.

#pragma target 3.5(또는 es3.0)

  • OpenGL ES 3.0 성능입니다(D3D 플랫폼에서 DX10 SM4.0, 지오메트리 셰이더는 제외).
  • DX11 9.x(WinPhone), OpenGL ES 2.0에서 지원하지 않습니다.
  • DX11+, OpenGL 3.2+, OpenGL ES 3+, Metal, PS4/XB1 콘솔에서 지원합니다.
  • 셰이더, 텍스처 배열 등에서 네이티브 정수 연산이 가능합니다.

#pragma target 4.0

  • DX11 셰이더 모델 4.0.
  • DX11 9.x(WinPhone), OpenGL ES 2.0/3.0/3.1, Metal에서 지원하지 않습니다.
  • DX11+, OpenGL 3.2+, OpenGL ES 3.1+AEP, Vulkan, PS4/XB1 콘솔에서 지원합니다.
  • 지오메트리 셰이더 등 es3.0 타겟의 모든 것이 포함됩니다.

#pragma target 4.5(또는 es3.1)

  • OpenGL ES 3.1 성능입니다(D3D 플랫폼에서 DX11 SM5.0, 테셀레이션 셰이더 제외).
  • SM5.0 이전 DX11, OpenGL 4.3 이전 버전(Mac), OpenGL ES 2.0/3.0에서 지원하지 않습니다.
  • DX11+ SM5.0, OpenGL 4.3+, OpenGL ES 3.1, Metal, Vulkan, PS4/XB1 콘솔에서 지원합니다.
  • 컴퓨트 셰이더, 랜덤 액세스 텍스처 쓰기, 단위 동작 등이 있습니다. 지오메트리 또는 테셀레이션 셰이더는 없습니다.

#pragma target 4.6(또는 gl4.1)

  • OpenGL 4.1 성능입니다(D3D 플랫폼에서 DX11 SM5.0, 컴퓨트 셰이더 제외). Mac이 지원하는 가장 높은 OpenGL 레벨입니다.
  • SM5.0 이전 DX11, OpenGL 4.1 이전 버전, OpenGL ES 2.0/3.0/3.1, Metal에서 지원하지 않습니다.
  • DX11+ SM5.0, OpenGL 4.1+, OpenGL ES 3.1+AEP, Vulkan, Metal(지오메트리 없음), PS4/XB1 콘솔에서 지원합니다.

#pragma target 5.0

  • DX11 셰이더 모델 5.0.
  • SM5.0 이전 DX11, OpenGL 4.3 이전 버전(Mac), OpenGL ES 2.0/3.0/3.1, Metal에서 지원하지 않습니다.
  • DX11+ SM5.0, OpenGL 4.3+, OpenGL ES 3.1+AEP, Vulkan, Metal(지오메트리 없음), PS4/XB1 콘솔에서 지원합니다.

모든 OpenGL 유사 플랫폼(모바일 포함)은 “셰이더 모델 3.0 지원 가능”으로 간주됩니다. WP8/WinRT 플랫폼(DX11 기능 레벨 9.x)은 셰이더 모델 2.5만 가능한 것으로 간주됩니다.

지원되는 ’#pragma require’ 이름

#pragma require 지시문에 지원되는 기능 이름의 목록입니다.

  • interpolators10: 버텍스에서 프래그먼트로 넘기는 인터폴레이터(“varyings”)가 10가지 이상 지원됩니다.
  • interpolators15: 버텍스에서 프래그먼트로 넘기는 인터폴레이터(“varyings”)가 15가지 이상 지원됩니다.
  • interpolators32: 버텍스에서 프래그먼트로 넘기는 인터폴레이터(“varyings”)가 32가지 이상 지원됩니다.
  • mrt4: 렌더 타겟이 여러 개(4개 이상)입니다.
  • mrt8: 렌더 타겟이 여러 개(8개 이상)입니다.
  • derivatives: 픽셀 셰이더 도함수 명령어(ddx/ddy)입니다.
  • samplelod: 명시적 텍스처 LOD 샘플링(tex2Dlod/SampleLevel)입니다.
  • fragcoord: 픽셀 셰이더의 픽셀 위치(화면: XY, 클립 공간: ZW 뎁스) 입력입니다.
  • integers: 정수는 실제 데이터 타입입니다(bit/shift 연산 포함).
  • 2darray: 2D 텍스처 배열(Texture2DArray)입니다.
  • cubearray: 큐브맵 배열(CubemapArray)입니다.
  • instancing: SV_InstanceID 입력 시스템 값입니다.
  • geometry: DX10 지오메트리 셰이더입니다.
  • compute: 컴퓨트 셰이더, 구조화된 버퍼, 원자 연산입니다.
  • randomwrite: “random write”(UAV) 텍스처입니다.
  • tesshw: 하드웨어 테셀레이션을 위한 GPU 지원입니다. 단, 테셀레이션 셰이더 단계는 지원되지 않을 수 있습니다(예: Metal은 테셀레이션을 지원하나, 셰이더 단계를 통해 지원하지는 않음).
  • tessellation: 테셀레이션 헐/도메인 셰이더 단계입니다.
  • msaatex: 멀티 샘플 텍스처에 액세스할 수 있습니다(HLSL의 Texture2DMS).
  • sparsetex: 상주성 정보가 있는 스파스 텍스처(D3D에서 “Tier2” 지원, CheckAccessFullyMapped HLSL 함수)입니다. 현재 DX11/12에서만 구현됩니다.
  • framebufferfetch: Framebuffer 페치. 픽셀 셰이더에서 입력 픽셀 컬러를 읽을 수 있습니다.

광범위한 #pragma target 지시문은 상기 요구 사항의 약어로, 다음에 상응합니다.

  • 2.5: derivatives
  • 3.0: 2.5 + interpolators10 + samplelod + fragcoord
  • 3.5: 3.0 + interpolators15 + mrt4 + integers + 2darray + instancing
  • 4.0: 3.5 + geometry
  • 5.0: 4.0 + compute + randomwrite + tesshw + tessellation
  • 4.5: 3.5 + compute + randomwrite
  • 4.6: 4.0 + cubearray + tesshw + tessellation

Direct3D에서는 셰이더 모델 4.0이 “mrt8”도 의미하며, 셰이더 모델 5.0은 “interpolators32”와 “cubearray”를 의미합니다. 단, 이는 다수의 모바일 플랫폼에서 제공되지 않을 수도 있습니다. 따라서 기존 셰이더와의 이전 버전과의 호환성 측면에서는 #pragma target 4.0을 작성하더라도 자동으로 8 MRT 지원이 요구되지는 않으며, #pragma target 5.0을 작성하더라도 인터폴레이터 32개나 큐브맵 배열이 요구되지 않습니다.

참고 항목


  • 2018–03–20 페이지 수정됨
  • Unity 2018.1에서 셰이더 #pragma 지시문 추가됨 NewIn20181
  • 2018.1에서 금속용 테셀레이션(Tessellation for Metal) 추가됨
Shader compilation: pragma directives
Shader compilation: targeting graphics APIs
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961