Что представляет собой постоянная 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).