Trong phần 6.4 Bộ đệm liên tục của cuốn sách Kết xuất và tính toán thực tế với Direct3D 11 (trang 325, 326), nó được đề cập:
Theo mặc định, trình biên dịch HLSL sẽ cố gắng căn chỉnh các hằng số sao cho chúng không mở rộng nhiều thanh ghi float4. [...] Việc đóng gói cho bộ đệm không đổi HLSL cũng có thể được chỉ định thủ công thông qua từ khóa packoffset.
Tôi giả sử một quy tắc tương tự sẽ áp dụng cho các Đối tượng bộ đệm đồng nhất, tương đương OpenGL, vì chúng ánh xạ tới cùng một tính năng phần cứng.
Thế còn đồng phục vani thì sao? Các quy tắc áp dụng khi khai báo đồng phục là gì?
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?
Nếu trình biên dịch có thể thực hiện tối ưu hóa như vậy, thì chúng tốt như thế nào? Chúng ta có thể nói rõ ràng trình biên dịch sẽ đóng gói hay không, và khi nào chúng ta nên?
s_buffer_load_dword
hướng dẫn - những người đang đọc đồng phục đầu vào và số cuối cùng trong hex là phần bù để đọc từ đó. Nó hiển thị trong trường hợp đầu tiênxy
là ở offset 0 vàzw
ở offset 16. Trong trường hợp thứ hai, bạn cóxy
ở offset 0,z
ở offset 16 vàzw
ở offset 32. Nó xuất hiện tất cả các đồng phục được căn chỉnh 16 byte riêng lẻ và không được đóng gói cùng nhau hoặc sắp xếp lại.