Version: Unity 6.0 (6000.0)
言語 : 日本語
コンピュートシェーダーの実行
シェーダーの最適化

複数のプラットフォーム用のコンピュートシェーダーの記述

クロスプラットフォームでの最良の実践法

DirectX 11 (DX11) は、他のプラットフォーム (MetalOpenGL ES など) ではサポートされていない多くの操作をサポートしています。したがって、DX11 だけの環境を考えるより、サポートが少ないプラットフォームで、シェーダーの動作を明確に定義する必要があります。考慮すべき点は以下のとおりです。

  • アウトオブバンドのメモリアクセスが悪い点。DX11 は、読み込み時に常にゼロを返し、問題なくデータの一部を読み込むかもしれませんが、サポートが少ないプラットフォームでは、これを行う際に GPU がクラッシュする可能性があります。DX11 特有のハック、スレッドグループサイズの倍数と一致しないバッファサイズ、バッファの先頭や末尾から隣接するデータ要素を読み取ろうとすること、などの同様の非互換性に注意してください。

  • リソースを初期化する点。新しいバッファとテクスチャの内容は未定義です。プラットフォームの中にはすべてゼロを示すものもありますが、そうでないものでは、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 の GraphicsFormat と RenderTextureFormat を、対応する 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
コンピュートシェーダーの実行
シェーダーの最適化