Unity에서 사용하는 셰이딩 언어
셰이더 데이터 타입 및 정밀도

셰이더 컴파일 타겟 레벨

표면 셰이더 또는 일반 셰이더 프로그램으로 작성할 때 HLSL 소스를 다른 “셰이더 모델”로 컴파일할 수 있습니다. 더 최신 GPU 기능을 사용하려면 더 높은 버전의 셰이더 컴파일 타겟을 사용해야 합니다.

참고: 더 높은 버전의 셰이더 컴파일 타겟을 사용하면 셰이더가 구형 GPU 또는 플랫폼에서 작동하는 것을 막을 수 있습니다.

#pragma target name 지시문 또는 더욱 구체적인 #pragma require feature … 지시문을 사용하여 컴파일 타겟을 나타내십시오. 예:

# pragma target 3.5
# pragma require integers 2darray instancing

기본 컴파일 타겟

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) 추가됨
Unity에서 사용하는 셰이딩 언어
셰이더 데이터 타입 및 정밀도