代码之家  ›  专栏  ›  技术社区  ›  crush

常数0.0039215689代表什么?

  •  314
  • crush  · 技术社区  · 10 年前

    我一直在各种图形头文件中看到这个不断弹出的窗口

    0.0039215689
    

    这似乎与颜色有关?

    这是第一个 hit on Google :

    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
    

    这个数字代表什么?为什么没有人宣布它为常量?

    我在谷歌上找不到任何解释它的东西。

    2 回复  |  直到 10 年前
        1
  •  387
  •   Community CDub    7 年前

    0.0039215689 大约等于 1/255 .

    看到这是OpenGL,性能可能很重要。因此,可以安全地猜测,这是出于性能原因。

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


    边注:

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

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

    由于浮点舍入错误。

    因此,虽然现代编译器可能足够聪明,可以进行这种优化,但除非您通过编译器标志明确告诉他们,否则不允许他们这样做。

    相关: Why doesn't GCC optimize a*a*a*a*a*a to (a*a*a)*(a*a*a)?

        2
  •  79
  •   David Heffernan    10 年前

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

    正如Ilmari Karonen所指出的,即使这是一个优化,也是一个相当糟糕的表达。乘以 (1.0f/255) .