C语言 常数0.0039215689代表什么?



我一直在各种图形头文件中看到这个常量弹出

0.0039215689

这似乎和颜色有关?

这是谷歌上的第一个点击:

void RDP_G_SETFOGCOLOR(void)
{
    Gfx.FogColor.R = _SHIFTR(w1, 24, 8) * 0.0039215689f;
    Gfx.FogColor.G = _SHIFTR(w1, 16, 8) * 0.0039215689f;
    Gfx.FogColor.B = _SHIFTR(w1, 8, 8) * 0.0039215689f;
    Gfx.FogColor.A = _SHIFTR(w1, 0, 8) * 0.0039215689f;
}
void RDP_G_SETBLENDCOLOR(void)
{
    Gfx.BlendColor.R = _SHIFTR(w1, 24, 8) * 0.0039215689f;
    Gfx.BlendColor.G = _SHIFTR(w1, 16, 8) * 0.0039215689f;
    Gfx.BlendColor.B = _SHIFTR(w1, 8, 8) * 0.0039215689f;
    Gfx.BlendColor.A = _SHIFTR(w1, 0, 8) * 0.0039215689f;
    if(OpenGL.Ext_FragmentProgram && (System.Options & BRDP_COMBINER)) {
        glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 2, Gfx.BlendColor.R, Gfx.BlendColor.G, Gfx.BlendColor.B, Gfx.BlendColor.A);
    }
}
//...more like this

这个数字代表什么?为什么似乎没有人将它声明为const?

我在Google上找不到任何解释

0.0039215689近似等于1/255

考虑到这是OpenGL,性能可能很重要。因此,可以放心地猜测,这样做是出于性能原因。

乘以倒数比重复除以255要快。


注:

如果你想知道为什么这样的微优化不留给编译器,这是因为它是一个不安全的浮点优化。换句话说:

x / 255  !=  x * (1. / 255)

由于浮点舍入错误。

因此,尽管现代编译器可能足够聪明地进行此优化,但它们不允许这样做,除非您通过编译器标志显式地告诉它们。

相关:为什么不# 39;t GCC优化一个* * * * *一个(a * *) * (a * *) ?

通过0.0039215689f的乘法将0到255范围内的整数值颜色强度转换为0到1范围内的实值颜色强度。

正如Ilmari Karonen指出的那样,即使这是一个优化,它也是一个相当糟糕的表达。如果乘以(1.0f/255)就清楚多了。

相关内容

  • 没有找到相关文章

最新更新