主なグラフィックスAPIのメモリアライメント

提供: MonoBook
2024年4月18日 (木) 01:09時点におけるAdministrator (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

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

VulkanGPU(のドライバ)ごとに仕様が異なる前代未聞のクソ仕様。 そのクソ仕様はVkMemoryRequirements構造体に格納されるのでalignmentメンバーの整数倍にする。

AMDが作ってくれたVulkan Memory Allocatorを使いましょう。

Metal

Metalは深く考えなくても良いらしいが、とりあえずDirect3Dに合わせとけ。