Я пишу шейдер (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.