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

提供: MonoBook
2024年4月18日 (木) 01:07時点におけるAdministrator (トーク | 投稿記録)による版 (ページの作成:「== Direct3D == Direct3Dでは16バイト区切りにする。16バイトの境界線を跨ぐように変数を配置しないこと。 NG <source lang="c"> stru…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

Direct3D

Direct3Dでは16バイト区切りにする。16バイトの境界線を跨ぐように変数を配置しないこと。

NG

struct Buffer1 {
    flaot3 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に合わせとけ。

画像処理