gpt4 book ai didi

hlsl - 将四个字节打包成一个 float

转载 作者:行者123 更新时间:2023-12-04 04:36:02 27 4
gpt4 key购买 nike

我正在编写一个着色器(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
通过猜测和检查,在保持[0 ... 1]范围的同时,我可以使用的最大值是64。不幸的是,这也意味着我要失去一些精度-6位而不是8位。

最佳答案

看一下:
http://diaryofagraphicsprogrammer.blogspot.com/2009/10/bitmasks-packing-data-into-fp-render.html

简短的答案是,不可能将4个浮点数无损打包成1个浮点数。

即使您确实找到了一种包装4个浮标的方法,并存储了它们的指数和有效位数,但打包和拆包过程可能会非常昂贵。

关于hlsl - 将四个字节打包成一个 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4811219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com