Tôi đang viết một bóng đổ (HLSL) và tôi cần đóng gói một giá trị màu vào định dạng R32. Tôi đã tìm thấy các đoạn mã khác nhau để đóng gói một phao vào định dạng R8G8B8A8, nhưng không có mã nào trong số chúng dường như hoạt động ngược lại. Tôi đang nhắm mục tiêu SM3.0, do đó (afaik) bit hoạt động không phải là một lựa chọn.Đóng gói bốn byte trong phao
Nói tóm lại, tôi cần để có thể làm điều này:
float4 color = ...; // Where color ranges from 0 -> 1
float packedValue = pack(color);
ai biết làm thế nào để làm điều này?
CẬP NHẬT
Tôi đã nhận được một số tiến triển ... có lẽ điều này sẽ giúp làm rõ câu hỏi.
giải pháp tạm thời của tôi là như vậy:
const int PRECISION = 64;
float4 unpack(float value)
{
float4 color;
color.a = value % PRECISION;
value = floor(value/PRECISION);
color.b = value % PRECISION;
value = floor(value/PRECISION);
color.g = value % PRECISION;
value = floor(value/PRECISION);
color.r = value;
return color/(PRECISION - 1);
}
float pack(float4 color)
{
int4 iVal = floor(color * (PRECISION - 1));
float output = 0;
output += iVal.r * PRECISION * PRECISION * PRECISION;
output += iVal.g * PRECISION * PRECISION;
output += iVal.b * PRECISION;
output += iVal.a;
return output;
}
tôi về cơ bản ... giả vờ Tôi đang sử dụng các loại nguyên: s
Qua đoán và kiểm tra, 64 là con số cao nhất tôi có thể sử dụng trong khi vẫn duy trì phạm vi [0 ... 1]. Thật không may, điều đó cũng có nghĩa là tôi đang mất một số chính xác - 6 bit thay vì 8.
Nó sẽ được hỏi cuối cùng, vì vậy bạn cũng có thể nhận được nó hơn với :) tại sao bạn phải sử dụng R32 thay vì một định dạng số nguyên? – eodabash
Heh ... Tôi biết nó đã đến, nhưng vẫn ... Trong thực tế, tôi đang sử dụng R32G32B32A32, tôi chỉ nói R32 để đơn giản hóa. Tôi chỉ cố gắng tìm ra cách tôi có thể đẩy càng nhiều thông tin càng tốt vào một mục tiêu render đơn. Tất nhiên, tôi vẫn cần phải làm một số phép đo, nhưng tôi tưởng tượng đẩy tất cả dữ liệu của tôi vào một mục tiêu render đơn là rẻ hơn một chút so với sử dụng bốn thông qua tàu điện ngầm. – YellPika
Tôi rất mong được thấy những câu trả lời mà mọi người có thể nghĩ ra cho câu hỏi này. – Olhovsky