Я пишу шейдер (HLSL), и мне нужно упаковать значение цвета в формат R32. Я нашел различные фрагменты кода для упаковки float в формат R8G8B8A8, но ни один из них, похоже, не работает в обратном порядке. Я нацелен на SM3.0, поэтому (afaik) бит-операции не являются опцией.Пакет четыре байта в поплавке
Подводя итог, я должен быть в состоянии сделать это:
float4 color = ...; // Where color ranges from 0 -> 1
float packedValue = pack(color);
Любой знает, как это сделать?
UPDATE
Я получил некоторых продвижения вперед ... возможно, это поможет прояснить этот вопрос.
Мое временное решение как таковое:
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 было наибольшее число я мог бы использовать при сохранении a [0 ... 1]. К сожалению, это также означает, что я теряю некоторую точность - 6 бит вместо 8.
В конце концов, вас спросят, так что вы могли бы также решить это. Почему вы должны использовать R32 вместо целочисленного формата? – eodabash
Хех ... Я знал, что это придет, но все же ... На самом деле, я использую R32G32B32A32, я только сказал, что R32 упрощает. Я просто пытаюсь понять, как я могу записать как можно больше информации в одну цель рендеринга. Конечно, мне все же нужно делать некоторые измерения, но я думаю, что все мои данные в одну цель визуализации немного дешевле, чем использование четырех через MRT. – YellPika
Я с нетерпением жду, чтобы узнать, какие ответы люди могут придумать для этого вопроса. – Olhovsky