У розділі 6.4 Постійні буфери книги Практичне візуалізація та обчислення з Direct3D 11 (стор. 325, 326) згадується:
За замовчуванням компілятор HLSL спробує вирівняти константи таким чином, щоб вони не охоплювали декілька регістрів float4. [...] Упаковка для постійного буфера HLSL також може бути визначена вручну за допомогою ключового слова packoffset.
Я припускаю, що аналогічне правило застосовуватиметься до еквівалента об'єктів буферного буфера OpenGL, оскільки вони відображають однакову апаратну функцію.
А як із ванільною формою? Які правила застосовуються при декларуванні уніформи?
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?
Якщо компілятор може робити такі оптимізації, наскільки вони хороші? Чи можемо ми прямо сказати компілятору упакувати чи ні, і коли ми маємо?
s_buffer_load_dword
інструкції - вони читають вхідну форму, а останнє число в шістнадцятковій частині - це зміщення, яке слід прочитати. Він показує, що в першому випадкуxy
встановлено зсув 0 іzw
зсув 16. У другому випадку ви маєтеxy
зсув 0,z
зсув 16 таzw
зсув 32. Здається, всі уніформи індивідуально вирівнюються в 16 байтах, а не упаковуються. разом або упорядковано.