Dans la section 6.4 Constant Buffers du livre Practical Rendering & Computation with Direct3D 11 (pages 325, 326), il est mentionné:
Par défaut, le compilateur HLSL tentera d'aligner les constantes de sorte qu'elles ne s'étendent pas sur plusieurs registres float4. [...] L'emballage d'un tampon de constantes HLSL peut également être spécifié manuellement via le mot clé packoffset.
Je suppose qu'une règle similaire s'appliquera à l'équivalent OpenGL, Uniform Buffer Objects, car ils correspondent à la même fonctionnalité matérielle.
Et les uniformes vanille? Quelles sont les règles qui s'appliquent lors de la déclaration d'uniformes?
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?
Si le compilateur peut faire de telles optimisations, à quel point sont-elles bonnes? Pouvons-nous dire explicitement au compilateur de compresser ou non, et quand le devrions-nous?
s_buffer_load_dwordinstructions - celles-ci lisent les uniformes d'entrée, et le dernier nombre en hexadécimal est le décalage à lire. Il montre dans le premier casxyest à l'offset 0 etzwà l'offset 16. Dans le second cas, vous avezxyà l'offset 0,zà l'offset 16 etzwà l'offset 32. Il apparaît que tous les uniformes sont individuellement alignés sur 16 octets et non emballés ensemble ou réorganisé.