Di bagian 6.4 Buffer Konstan dari buku Rendering Praktis & Komputasi dengan Direct3D 11 (halaman 325, 326) disebutkan:
Secara default, kompiler HLSL akan berusaha untuk menyelaraskan konstanta sehingga mereka tidak menjangkau beberapa register float4. [...] Pengepakan untuk buffer konstan HLSL juga dapat secara manual ditentukan melalui kata kunci paket.
Saya berasumsi aturan serupa akan berlaku untuk OpenGL, Uniform Buffer Objects, karena mereka memetakan ke fitur perangkat keras yang sama.
Bagaimana dengan seragam vanila? Apa aturan yang berlaku saat mendeklarasikan seragam?
uniform vec2 xy; // Can we expect the compiler to pack xy
uniform vec2 zw; // into a same four component register?
uniform vec2 rg;
uniform float foo; // Will this prevent from packing rg and ba?
uniform vec2 ba; // If so, will foo eat up a full four components register?
Jika kompiler dapat melakukan optimasi seperti itu, seberapa baik mereka? Bisakah kita secara eksplisit memberitahu kompiler untuk berkemas atau tidak, dan kapan kita harus?
sumber
s_buffer_load_dword
instruksi - mereka membaca seragam input, dan angka terakhir dalam hex adalah offset untuk dibaca. Ini menunjukkan dalam kasus pertamaxy
adalah pada offset 0 danzw
pada offset 16. Dalam kasus kedua Anda memilikixy
pada offset 0,z
pada offset 16, danzw
pada offset 32. Tampaknya semua seragam secara individual 16-byte-sejajar, dan tidak dikemas bersama atau memesan kembali.