cru*_*ush 308 c floating-point constants magic-numbers
我一直看到这个常量弹出各种图形头文件
0.0039215689
Run Code Online (Sandbox Code Playgroud)
它似乎与颜色有关吗?
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
Run Code Online (Sandbox Code Playgroud)
这个数字代表什么?为什么似乎没有人将它声明为const?
我无法在Google上找到解释它的任何内容.
Mys*_*ial 377
0.0039215689
差不多等于1/255
.
看到这是OpenGL,性能可能很重要.所以可以安全地猜测这是出于性能原因而做的.
乘以倒数比重复除以255要快.
边注:
如果您想知道为什么这样的微优化不会留给编译器,那是因为它是一种不安全的浮点优化.换一种说法:
x / 255 != x * (1. / 255)
Run Code Online (Sandbox Code Playgroud)
由于浮点舍入错误.
因此,虽然现代编译器可能足够聪明以进行此优化,但除非您通过编译器标志明确告诉它们,否则不允许它们执行此操作.
相关: 为什么GCC没有优化a*a*a*a*a*a到(a*a*a)*(a*a*a)?
Dav*_*nan 79
该乘法通过0.0039215689f
将0到255范围内的整数值颜色强度转换为0到1范围内的实值颜色强度.
正如Ilmari Karonen指出的那样,即使这是一个优化,它也是一个相当糟糕的表达.繁殖会更加清晰(1.0f/255)
.