我一直在各种图形头文件中看到这个不断弹出
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?
我在谷歌上找不到任何解释它的东西。
0.0039215689大约等于1/255。
1/255
看到这是OpenGL,性能可能很重要。所以可以肯定地猜测这是出于性能原因。
乘以倒数比重复除以 255 更快。
边注:
如果您想知道为什么不将这种微优化留给编译器,那是因为它是不安全的浮点优化。换句话说:
x / 255 != x * (1. / 255)
由于浮点舍入误差。
因此,尽管现代编译器可能足够聪明地进行这种优化,但除非您通过编译器标志明确告诉它们,否则它们是不允许这样做的。