Я пишу шейдер (HLSL), и мне нужно упаковать значение цвета в формат R32.Я нашел различные фрагменты кода для упаковки поплавка в формат R8G8B8A8, но ни один из них, похоже, не работает в обратном порядке.Я нацеливаюсь на SM3.0, поэтому (afaik) битовые операции не подходят.
Подводя итог, я должен быть в состоянии сделать это:
float4 color = ...; // Where color ranges from 0 -> 1
float packedValue = pack(color);
Кто-нибудь знаеткак это сделать?
ОБНОВЛЕНИЕ
Я получил некоторый прогресс ... возможно, это поможет прояснить вопрос.
Мой временныйРешение таково:
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;
}
Я в основном ... притворяюсь, что использую целочисленные типы: s
Через догадки и проверки 64 было наибольшим числом, которое я мог использовать, сохраняя при этомДиапазон [0 ... 1].К сожалению, это также означает, что я теряю некоторую точность - 6 бит вместо 8.