Tôi đang cố nghiên cứu bản đồ bóng trong WebGL. Tôi thấy cùng một đoạn mã đổ bóng được sao chép trong nhiều thư viện và ví dụ khác nhau để đạt được điều này. Tuy nhiên không nơi nào tôi tìm thấy lời giải thích về cách nó hoạt động.Đóng gói float vào vec4 - mã này hoạt động như thế nào?
Ý tưởng là lưu giá trị độ sâu (một phao đơn) vào bộ đệm màu (vec4). Có một chức năng gói tiết kiệm nổi đến vec4 và giải nén chức năng lấy nổi từ vec4.
vec4 pack_depth(const in float depth)
{
const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);
const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);
vec4 res = fract(depth * bit_shift);
res -= res.xxyz * bit_mask;
return res;
}
float unpack_depth(const in vec4 rgba_depth)
{
const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);
float depth = dot(rgba_depth, bit_shift);
return depth;
}
tôi sẽ tưởng tượng rằng đóng gói một phao vào vec4 phải là một vấn đề tầm thường, chỉ cần sao chép nó vào một trong 4 vị trí của vec4 và để người khác sử dụng. Đó là lý do tại sao logic chuyển bit trong đoạn mã trên lại khó hiểu với tôi.
Có ai có thể làm sáng tỏ không?
Tôi hiểu. Nó không phải là rõ ràng với tôi rằng bộ đệm màu trong nội bộ lưu trữ các giá trị màu sắc như 4 số nguyên mặc dù chúng tôi ăn nó một vec4. Nếu đó là như vậy, thì mã trên có ý nghĩa. Cảm ơn. – Jayesh
Nói đúng là chuyển đổi là số điểm cố định 32 bit - không phải là số dấu phẩy động. – Mortennobel