Упаковать четыре байта в число с плавающей точкой

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

9
задан YellPika 29 January 2011 в 19:46
поделиться