版本:Unity 6 (6000.0)
语言 : English
运行计算着色器
优化着色器

为多个平台编写计算着色器

跨平台最佳实践

DirectX 11 (DX11) 支持许多其他平台(如 MetalOpenGL ES)不支持的操作。因此,您应始终确保您的 着色器在 GPU 上运行的程序。 更多信息
参见 词汇表
在提供较少支持的平台上具有明确定义的行为,而不仅仅是在 DX11 上。以下是一些需要考虑的事项

  • 越界内存访问很糟糕。DX11 可能会在读取时始终返回零,并且在没有问题的情况下读取一些写入,但提供较少支持的平台可能会在执行此操作时使 GPU 崩溃。注意 DX11 特定的 hack、缓冲区大小与线程组大小的倍数不匹配、尝试从缓冲区的开头或结尾读取相邻数据元素以及类似的不兼容性。

  • 初始化您的资源。新缓冲区和纹理的内容未定义。某些平台可能会提供全为零的值,但在其他平台上,可能包含任何内容,包括 NaN。

  • 绑定计算着色器声明的所有资源。即使您确信着色器在其当前状态下不使用资源,因为存在分支,您仍必须确保已将资源绑定到它。

平台特定差异

  • Metal(适用于 iOS 和 tvOS 平台)不支持对纹理的原子操作。Metal 也不支持对缓冲区的 GetDimensions 查询。如果需要,将缓冲区大小信息作为常量传递给着色器。
  • OpenGL ES 3.1(适用于(Android、iOS、tvOS 平台)仅保证一次支持 4 个计算缓冲区。实际实现通常支持更多,但一般来说,如果为 OpenGL ES 开发,您应该考虑将相关数据分组到结构体中,而不是将每个数据项放在自己的缓冲区中。
  • OpenGL(ES)和 Vulkan 要求对不是只写的 RWTextures<T> 使用图像格式限定符。
    Unity 从尖括号中的类型 T 派生此限定符。格式限定符需要与绑定到 RWTexture 的 GraphicsFormat/RenderTextureFormatRenderTexture 的格式匹配。下表将 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 unsupported snorm min16float4/half4 rgba16_snorm
R8G8B8A8_SNorm unsupported snorm float4 rgba8_snorm
R16G16_SNorm unsupported snorm min16float2/half2 rg16_snorm
R8G8_SNorm unsupported snorm float2 rg8_snorm
R16_SNorm unsupported snorm min16float/half r16_snorm
R8_SNorm unsupported snorm float r8_snorm
R32G32B32A32_SInt ARGBInt int4 rgba32i
R16G16B16A16_SInt unsupported min16int4 rgba16i
R8G8B8A8_SInt unsupported min12int4 rgba8i
R32G32_SInt RGInt int2 rg32i
R16G16_SInt unsupported min16int2 rg16i
R8G8_SInt unsupported min12int2 rg8i
R32_SInt RInt int r32i
R16_SInt unsupported min16int r16i
R8_SInt unsupported min12int r8i
R32G32B32A32_UInt unsupported uint4 rgba32i
R16G16B16A16_UInt RGBAUShort min16uint4 rgba16ui
R8G8B8A8_UInt unsupported unsupported rgba8ui
R32G32_UInt unsupported uint2 rg32ui
R16G16_UInt unsupported min16uint2 rg16ui
R8G8_UInt unsupported unsupported rg8ui
R32_UInt unsupported uint r32ui
R16_UInt unsupported min16uint r16ui
R8_UInt unsupported unsupported r8ui
A2B10G10R10_UIntPack32 unsupported unsupported rgb10_a2ui
运行计算着色器
优化着色器