Что представляет собой постоянная 0,0039215689?
Я продолжаю видеть, что эта константа появляется в разных файлах графических заголовков
0.0039215689
Кажется, что-то связано с цветом?
Вот первый хит в 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
Что представляет этот номер? Почему никто, кажется, не объявляет его как const?
Я ничего не смог найти в Google, который объяснил это.
Ответы
Ответ 1
0.0039215689
приблизительно равно 1/255
.
Увидев, что это OpenGL, производительность, вероятно, важна. Поэтому, вероятно, можно с уверенностью предположить, что это было сделано по соображениям производительности.
Умножение на обратное происходит быстрее, чем повторное деление на 255.
Боковое примечание:
Если вам интересно, почему такая микро-оптимизация не оставлена компилятору, это потому, что это небезопасная оптимизация с плавающей запятой. Другими словами:
x / 255 != x * (1. / 255)
из-за ошибок округления с плавающей запятой.
Таким образом, хотя современные компиляторы могут быть достаточно умными для этой оптимизации, им не разрешается делать это, если вы явно не указали им через флаг компилятора.
Связано: Почему GCC не оптимизирует a * a * a * a * a * a (a * a * a) * (a * а * а)?
Ответ 2
Это умножение на 0.0039215689f
преобразует интенсивность цвета с целым числом в диапазоне от 0 до 255 до реальной значащей интенсивности цвета в диапазоне от 0 до 1.
Как указывает Илмари Каронен, даже если это оптимизация, это довольно плохо выраженная. Было бы гораздо яснее размножаться на (1.0f/255)
.