Version: 6000.3
语言: 中文
运行计算着色器
优化着色器

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

跨平台最佳实践

DirectX 11 (DX11) 和 DirectX 12 (DX12) 支持其他平台(例如 MetalOpenGL ES)不支持的许多作。因此,您应该始终确保您的着色器在 GPU 上运行的程序。更多信息
请参阅术语表
在提供较少支持的平台上具有明确定义的行为,而不仅仅是在 DX11 或 DX12 上。以下是需要考虑的几件事:

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

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

  • 绑定计算着色器声明的所有资源。即使确定着色器由于分支而不使用当前状态的资源,仍必须确保资源绑定到它。

特定于平台的差异

  • Metal(适用于iOS和tvOS平台)不支持对纹理进行原子作。金属也不支持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 类型和图像格式限定符:
图形格式 渲染纹理格式 HLSL 类型 GLSL 图像格式限定符
R32G32B32A32_SFloat ARGB弗洛特 浮点4 RGBA32F
R16G16B16A16_SFloat ARGB哈尔夫 min16float4/half4 RGBA16F
R32G32_SFloat RG弗洛特 浮点2 RG32F
R16G16_SFloat RGHalf min16float2/half2 RG16F
B10G11R11_UFloatPack32 RGB111110浮点 最小10浮点3 r11f_g11f_b10f
R32_SFloat RFloat R32F
R16_SFloat 阿尔夫 min16浮点/半 R16F
R16G16B16A16_UNorm ARGB64 的 UNORM 最小16浮点4/半4 RGBA16
A2B10G10R10_UNormPack32 ARGB2101010 unorm min10float4 rgb10_a2
R8G8B8A8_UNorm ARGB32 UNORM 浮子4 RGBA8
R16G16_UNorm RG32型 unorm min16float2/half2 RG16
R8G8_UNorm RG16型 unorm 浮子2 RG8
R16_UNorm R16 unorm min16浮点/半 R16
R8_UNorm R8 UNORM浮子 R8
R16G16B16A16_SNorm 支持 snorm min16float4/half4 rgba16_snorm
R8G8B8A8_SNorm 支持 snorm 浮子4 rgba8_snorm
R16G16_SNorm 支持 snorm min16float2/half2 rg16_snorm
R8G8_SNorm 支持 snorm 浮点数2 rg8_snorm
R16_SNorm 支持 snorm min16浮点/半 r16_snorm
R8_SNorm 支持 Snorm 浮点 r8_snorm
R32G32B32A32_SInt ARGBnt 整数4 RGBA32I型
R16G16B16A16_SInt 支持 最小16int4 RGBA16I型
R8G8B8A8_SInt 支持 最小12int4 RGBA8i(英文)
R32G32_SInt RGnt 整数2 RG32I型
R16G16_SInt 支持 最小16int2 RG16I型
R8G8_SInt 支持 最小12int2 RG8i
R32_SInt 里特 整数 R32I型
R16_SInt 支持 最小16整数 R16I型
R8_SInt 支持 最小12整数 R8i的
R32G32B32A32_UInt 支持 uint4 RGBA32I型
R16G16B16A16_UInt RGBAUShort 最小16uint4 RGBA16UI(英文)
R8G8B8A8_UInt 支持 支持 rgba8ui
R32G32_UInt 支持 uint2 RG32UI(英文)
R16G16_UInt 支持 最小16uint2 RG16UI(英文)
R8G8_UInt 支持 支持 rg8ui
R32_UInt 支持 因特 R32UI(英文)
R16_UInt 支持 最小16uint R16用户界面
R8_UInt 支持 支持 R8UI(英文)
A2B10G10R10_UIntPack32 支持 支持 rgb10_a2ui
运行计算着色器
优化着色器