What does the constant 0.0039215689 represent?
我一直看到这个常量出现在各种图形头文件中
1 | 0.0039215689 |
可能和颜色有关吧?
以下是谷歌的第一个成功案例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 |
号
这个数字代表什么?为什么没有人宣称它是警察?
我在谷歌上找不到任何解释它的东西。
鉴于这是OpenGL,性能可能很重要。因此,可以安全地猜测这是出于性能的原因。
乘以倒数比重复除以255快。
旁注:
如果你想知道为什么这样的微优化不留给编译器,那是因为它是一个不安全的浮点优化。换句话说:
1 | x / 255 != x * (1. / 255) |
由于浮点四舍五入错误。
因此,虽然现代编译器可能足够聪明,可以进行这种优化,但除非您通过编译器标志明确地告诉他们,否则不允许他们进行优化。
相关:为什么GCC不将a*a*a*a*a*a优化为(a*a*a)*(a*a*a)?
正如Ilmari Karonen指出的,即使这是一个优化,它也是一个表达得相当糟糕的优化。用