web-dev-qa-db-fra.com

Que représente la constante 0.0039215689?

Je continue à voir cette constante pop-up dans divers fichiers d'en-tête graphiques

0.0039215689

Cela semble avoir quelque chose à voir avec la couleur peut-être?

Voici le premier frappé sur 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

Que représente ce nombre? Pourquoi personne ne semble le déclarer comme un const?

Je n'ai rien trouvé sur Google qui l'explique.

307
crush

0.0039215689 est approximativement égal à 1/255.

Voyant qu'il s'agit d'OpenGL, les performances sont probablement importantes. Donc, il est probablement prudent de supposer que cela a été fait pour des raisons de performances.

Multiplier par l'inverse est plus rapide que de diviser à plusieurs reprises par 255.


Note latérale:

Si vous vous demandez pourquoi une telle micro-optimisation n'est pas laissée au compilateur, c'est qu'il s'agit d'une optimisation non sécurisée en virgule flottante. En d'autres termes:

x / 255  !=  x * (1. / 255)

en raison d'erreurs d'arrondi en virgule flottante.

Ainsi, bien que les compilateurs modernes soient assez intelligents pour effectuer cette optimisation, ils ne sont pas autorisés à le faire à moins que vous leur indiquiez explicitement via un indicateur de compilateur.

Connexes: Pourquoi GCC n'optimise-t-il pas un * a * a * a * a * a à (a * a * a) * (a * a * a)?

376
Mysticial

Cette multiplication par 0.0039215689f convertit une intensité de couleur entière comprise entre 0 et 255 en une intensité de couleur réelle comprise entre 0 et 1.

Comme le souligne Ilmari Karonen, même s'il s'agit d'une optimisation, elle est plutôt mal exprimée. Il serait tellement plus clair de multiplier par (1.0f/255).

79
David Heffernan