Version: Unity 6.0 (6000.0)
언어 : 한국어
컴퓨트 셰이더 실행
셰이더 최적화

여러 플랫폼용 컴퓨트 셰이더 작성

크로스 플랫폼 베스트 프랙티스

DirectX 11(DX11)은 다른 플랫폼(예: Metal 또는 OpenGL ES)에서 지원되지 않는 많은 작업을 지원합니다. 따라서 항상 DX11이 아닌 지원이 적은 플랫폼에서 셰이더 동작을 잘 정의해야 합니다. 다음은 고려해야 할 몇 가지 경우입니다.

  • 범위를 벗어난 메모리 액세스가 잘못되었습니다. DX11은 읽을 때 일관되게 0을 반환할 수 있으며 문제없이 일부 쓰기를 읽을 수 있지만 지원이 적은 플랫폼은 GPU를 충돌시킬 수 있습니다. DX11 특정 해킹, 스레드 그룹 크기의 배수와 일치하지 않는 버퍼 크기, 버퍼의 시작 또는 끝에서 이웃하는 데이터 요소를 읽으려는 시도 및 유사한 비호환성을 주의해야 합니다.

  • 리소스를 초기화합니다. 새 버퍼와 텍스처의 내용은 정의되지 않습니다. 일부 플랫폼은 모두 0을 제공하지만 다른 플랫폼에서는 NaN을 포함할 수 있습니다.

  • 컴퓨트 셰이더가 선언한 모든 리소스를 바인딩합니다. 셰이더가 브랜칭으로 인해 현재 상태의 리소스를 사용하지 않는다는 사실을 알고 있어도 리소스가 바인딩되어 있는지 확인해야 합니다.

플랫폼별 차이점

  • Metal(iOS 및 tvOS 플랫폼용)은 텍스처의 원자 연산을 지원하지 않습니다. Metal은 버퍼에 대한 GetDimensions 쿼리도 지원하지 않습니다. 필요한 경우 버퍼 크기 정보를 상수로 셰이더에 전달합니다.
  • OpenGL ES 3.1(Android, iOS, tvOS 플랫폼용)은 한 번에 4개의 컴퓨트 버퍼만 지원합니다. 실제 구현은 보통 더 많은 것을 지원하지만 일반적으로 OpenGL ES용으로 개발하는 경우에는 각 데이터 항목을 자체 버퍼에 두는 대신 관련 데이터를 구조체로 그룹화하는 것을 고려해야 합니다.
  • OpenGL(ES) 및 Vulkan은 쓰기 전용이 아닌 RWTextures<T>에 대해 이미지 포맷 한정자를 요구합니다.
    Unity는 각괄호로 둘러싸인 T 유형에서 이 한정자를 파생합니다. 포맷 한정자는 RWTexture에 바인딩된 RenderTextureGraphicsFormat/RenderTextureFormat과 일치해야 합니다. 다음 표는 Unity RenderTexture GraphicsFormats와 RenderTextureFormats를 해당 HLSL 유형 및 이미지 포맷 한정자에 매핑합니다.
GraphicsFormat RenderTextureFormat HLSL 유형 GLSL 이미지 포맷 한정자
R32G32B32A32_SFloat ARGBFloat float4 rgba32f
R16G16B16A16_SFloat ARGBHalf min16float4/half4 rgba16f
R32G32_SFloat RGFloat float2 rg32f
R16G16_SFloat RGHalf min16float2/half2 rg16f
B10G11R11_UFloatPack32 RGB111110Float min10float3 r11f_g11g_b10f
R32_SFloat RFloat float r32f
R16_SFloat RHalf min16float/half r16f
R16G16B16A16_UNorm ARGB64 unorm min16float4/half4 rgba16
A2B10G10R10_UNormPack32 ARGB2101010 unorm min10float4 rgb10_a2
R8G8B8A8_UNorm ARGB32 unorm float4 rgba8
R16G16_UNorm RG32 unorm min16float2/half2 rg16
R8G8_UNorm RG16 unorm float2 rg8
R16_UNorm R16 unorm min16float/half r16
R8_UNorm R8 unorm float r8
R16G16B16A16_SNorm 미지원 snorm min16float4/half4 rgba16_snorm
R8G8B8A8_SNorm 미지원 snorm float4 rgba8_snorm
R16G16_SNorm 미지원 snorm min16float2/half2 rg16_snorm
R8G8_SNorm 미지원 snorm float2 rg8_snorm
R16_SNorm 미지원 snorm min16float/half r16_snorm
R8_SNorm 미지원 snorm float r8_snorm
R32G32B32A32_SInt ARGBInt int4 rgba32i
R16G16B16A16_SInt 미지원 min16int4 rgba16i
R8G8B8A8_SInt 미지원 min12int4 rgba8i
R32G32_SInt RGInt int2 rg32i
R16G16_SInt 미지원 min16int2 rg16i
R8G8_SInt 미지원 min12int2 rg8i
R32_SInt RInt int r32i
R16_SInt 미지원 min16int r16i
R8_SInt 미지원 min12int r8i
R32G32B32A32_UInt 미지원 uint4 rgba32i
R16G16B16A16_UInt RGBAUShort min16uint4 rgba16ui
R8G8B8A8_UInt 미지원 미지원 rgba8ui
R32G32_UInt 미지원 uint2 rg32ui
R16G16_UInt 미지원 min16uint2 rg16ui
R8G8_UInt 미지원 미지원 rg8ui
R32_UInt 미지원 uint r32ui
R16_UInt 미지원 min16uint r16ui
R8_UInt 미지원 미지원 r8ui
A2B10G10R10_UIntPack32 미지원 미지원 rgb10_a2ui
컴퓨트 셰이더 실행
셰이더 최적화