【发布时间】:2021-01-13 01:42:51
【问题描述】:
我有一个用 Python 编写的函数,可以完美地满足我的需要(它不是我编写的)。 我需要将它转换为 C++,以便它提供相同的结果。我知道它将浮点数保存为 16 位纹理,所以我猜这是将 32 位 int 转换为 16 位浮点数。我需要做的就是让它在 C++ 中工作。这是python函数:
def packTextureBits(index):
index = int(index)
index = index +1024
sigh=index&0x8000
sigh=sigh<<16
exptest=index&0x7fff
if exptest==0:
exp=0
else:
exp=index>>10
exp=exp&0x1f
exp=exp-15
exp=exp+127
exp=exp<<23
mant=index&0x3ff
mant=mant<<13
index=sigh|exp|mant
cp = pointer(c_int(index))
fp = cast(cp, POINTER(c_float))
return fp.contents.value
这是我在 C++ 中的方法,但它返回的值完全搞砸了:
float PackIntToFloat(int value)
{
value += 1024;
int sign = (value & 0x8000) << 16;
int exp = value & 0x7fff;
if(exp != 0)
{
exp = value >> 10;
exp = exp & 0x1f;
exp = exp - 15 + 127;
exp = exp << 23;
}
int mant = (value & 0x3fff) << 13;
value = sign | exp | mant;
int* cp = new int(value);
float* fp = reinterpret_cast<float*>(cp);
return *fp;
// Also tried return (float)value; but returns other weird values.
}
【问题讨论】:
-
感谢您的回答。我发现了该主题以及之前的其他一些主题,那里的解决方案都没有给出与这个 python 相同的结果。远非如此。我的问题还在于我的知识水平并没有那么低,而且我不是 100% 知道您发布的转换是否与 python 转换实际上是一回事。
-
我不知道那里传入的是什么类型的 int,因为 python 甚至没有指定那是什么类型,但是在那个 python 函数的顶部它是
index = int(index);我假设 int在 python 中只是 32 位有符号整数。所以基本上我需要的是签署 int 32 来浮点 16 转换。 -
我知道调用它的代码是做什么的。 python中的这段代码来自UE4的Blender插件。基本上发生的情况是,搅拌器代码获取所有 3d 对象,将它们从 0 索引到存在的任何对象数量 - 这永远不会低于 0。然后将这些索引注入此函数,并将返回的值保存到纹理 alpha 通道.一个对象是一个像素,它有自己的 alpha。这恰好是 HDR 16 位纹理。然后在 UE4 中,材质函数在此纹理的每个像素的 alpha 上恢复该处理。该还原代码在 HLSL 中完成。
-
我在 UE4 中有自己的类似 3d 的工具,它是作为插件创建的。但是这个是用 C++ 编写的。而且我的网格也是从 0 到任何值的索引。我正在尝试重现此功能并以相同的方式将其写入纹理。
-
好吧,这可能行不通。首先,此操作所需的纹理类型是 FloatRGBA。不是U16。其次,红色、绿色和蓝色通道填充了所述对象在 3D 空间中的位置,它们是三个浮点数。他们不应该被转换。至少在原始插件中。
标签: python c++ floating-point integer bit