Version: Unity 6.0 (6000.0)
语言 : 中文
运行计算着色器
优化着色器

编写适用于多个平台的计算着色器

跨平台最佳实践

DirectX 11 (DX11) 支持在其他平台(如 MetalOpenGL ES)上不受支持的许多操作。因此,应始终确保着色器在提供更少支持的平台(而不是仅在 DX11 上)上具有良好定义的行为。以下是要考虑的一些事项:

  • 越界内存访问是错误的。DX11 在读取时可能始终返回零,并且在读取某些写入时没有问题,但提供较少支持的平台可能会在执行此操作时导致 GPU 崩溃。密切注意特定于 DX11 的破解问题,与线程组大小倍数不匹配的缓冲区大小,试图从缓冲区的开头或结尾读取相邻的数据元素,以及类似的不兼容性。

  • 初始化您的资源。新缓冲区和纹理的内容是未定义的。有些平台可能会提供全零,但在其他平台上,可能会有某种内容(包括非数字)。

  • 绑定计算着色器声明的所有资源。即使您确定着色器在当前状态下由于分支而没有使用资源,仍必须确保有资源与其绑定。

平台特定差异

  • 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
运行计算着色器
优化着色器