【问题标题】:Int to Float conversion Python to C++Int 到 Float 转换 Python 到 C++
【发布时间】: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


【解决方案1】:

所以我欠你们道歉。我很愚蠢,在发帖之前没有做足够的测试。我的 C++ 解决方案 100% 有效。我测试了纹理的不同颜色,结果发现,我以错误的方式为纹理分配了值。我尝试将浮点数推入纹理,它是 16 位纹理。在上述转换之后,我需要将这些浮点数转换为半精度浮点数,然后它开始工作。名为 PF_FloatRGBA 的纹理标志让我相信在此处分配浮点数是正确的,但事实并非如此。

我还需要学习很多东西。感谢您的所有帮助!

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 2016-09-01
    • 2014-04-30
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多