主なグラフィックスAPIのメモリアライメント
Direct3D
Direct3Dでは16バイト区切りにする。構造体のメンバー変数は16バイトの境界線を跨ぐように配置しないこと。
以下に擬似コードを示す。
- NG
struct Buffer1 {
float3 a ; 0 + 12 = 12
float2 b ; 12 + 8 = 20 # NG
}
- OK
struct Buffer1 {
float3 a ; 0 + 12 = 12
float1 _dummy1 ; 12 + 4 = 16 # OK
float2 b ; 0 + 8 = 8 # 16ごとに0にリセット
}
Vulkan
VulkanはGPU(のドライバ)ごとに仕様が異なる前代未聞のクソ仕様。 そのクソ仕様はvkGetBufferMemoryRequirements関数でVkMemoryRequirements構造体に格納されるのでalignmentメンバーの整数倍にする。
VkMemoryRequirements memReq;
vkGetBufferMemoryRequirements(device, buffer, &memReq);
こんなのやってられないのでAMDが作ってくれたVulkan Memory Allocatorを使いましょう。