307 votes

Que représente la constante 0,0039215689?

Je continue à voir cette constante apparaître dans divers fichiers d'en-tête graphiques

 0.0039215689
 

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

Voici le premier hit 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.

376voto

Mysticial Points 180300

0.0039215689 est approximativement égale à 1/255.

Voyant que c'est OpenGL, la performance est probablement important. Donc, il est probablement prudent de supposer que cela a été fait pour des raisons de performances.

En multipliant par l'inverse est plus rapide qu'à plusieurs reprises en divisant par 255.


Note De Côté:

Si vous vous demandez pourquoi un tel micro-optimisation n'est pas de gauche pour le compilateur, c'est parce que c'est un dangereux à virgule flottante d'optimisation. En d'autres termes:

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

en raison de virgule flottante des erreurs d'arrondi.

Ainsi, alors que les compilateurs modernes peuvent être assez intelligent pour faire cette optimisation, ils ne sont pas autorisés à le faire, sauf si vous explicitement leur dire via un compilateur drapeau.

Connexe: Pourquoi ne pas GCC optimiser un*un*un*un*un*un (a*a*a)*(a*a*a)?

79voto

David Heffernan Points 292687

Cette multiplication par 0.0039215689f convertit une intensité de couleur de valeur entière dans la plage de 0 à 255 en une intensité de couleur de valeur 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) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X