Que représente la constante 0.0039215689?

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

0.0039215689 

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

Voici le premier coup 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’expliquait.

0.0039215689 est approximativement égal à 1/255 .

Voyant que c’est OpenGL, les performances sont probablement importantes. Donc, il est probablement prudent de supposer que cela a été fait pour des raisons de performance.

La multiplication par l’inverse est plus rapide que la division répétée par 255.


Note latérale:

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

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

due à des erreurs d’arrondi en virgule flottante.

Donc, même si les compilateurs modernes peuvent être assez intelligents pour effectuer cette optimisation, ils ne sont pas autorisés à le faire, sauf si vous leur dites explicitement de le faire via un indicateur de compilation.

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

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, celle-ci est plutôt mal exprimée. Il serait tellement plus (1.0f/255) multiplier par (1.0f/255) .