본문 바로가기
Shader

유니티 셰이더 버전별 인터폴레이터 / 각 타겟별 성능

by 대마왕J 2021. 8. 3.

 

 

인터폴레이터 개수 한계

버텍스에서 프래그먼트 셰이더로 정보를 넘기는 데 사용할 수 있는 전체 인터폴레이터 변수 개수에는 제한이 있습니다. 이 제한은 플랫폼 및 GPU에 따라 달라지며 일반적인 가이드라인은 다음과 같습니다.

  • 인터폴레이터 최대 8개: OpenGL ES 2.0 (iOS/Android), Direct3D 11 9.x 레벨 (Windows 휴대폰), Direct3 9 셰이더 모델 2.0 (구형 PC)입니다. 인터폴레이터 개수에 제한이 있지만 각 인터폴레이터는 4-컴포넌트 벡터가 될 수 있으며 일부 셰이더는 제한을 충족하기 위하여 여러가지를 합칩니다. 예를 들어, 텍스처 좌표 2개를 float4 변수 하나로 패스할 수 있습니다. (첫 번째 좌표는 .xy로, 두 번째 좌표는 .zw로).
  • 인터폴레이터 최대 10개: Direct3D 9 셰이더 모델 3.0(#pragma target 3.0)입니다.
  • 인터폴레이터 최대 16개: OpenGL ES 3.0(iOS/Android), Metal(iOS)입니다.
  • 인터폴레이터 최대 32개: Direct3D 10 셰이더 모델 4.0(#pragma target 4.0)입니다.

특정 타겟 하드웨어에 상관 없이 성능을 위해서는 인터폴레이터를 최소한으로 사용하는 게 좋습니다

https://docs.unity3d.com/kr/current/Manual/SL-ShaderSemantics.html

 

셰이더 시맨틱 - Unity 매뉴얼

HLSL 셰이더 프로그램을 작성할 때 입력 및 출력 변수는 semantics를 통해 각각의 “의도”를 명시해야 합니다. 이는 HLSL 셰이더 언어의 표준 개념이며 자세한 내용은 MSDN의 시맨틱 문서를 참조하십

docs.unity3d.com

 

지원되는 ’#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만 가능한 것으로 간주됩니다.

https://docs.unity3d.com/kr/2019.4/Manual/SL-ShaderCompileTargets.html

 

셰이더 컴파일 타겟 레벨 - Unity 매뉴얼

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

docs.unity3d.com

 

반응형

댓글