Je continue de 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-t-il le déclarer comme const?
Je n'ai rien trouvé sur Google qui l'explique.
c
floating-point
constants
magic-numbers
écraser
la source
la source
(1.f/255)
?1/255 == 0.00(3921568627450980)
- parens signifie répétition.Réponses:
0.0039215689
est approximativement égal à1/255
.Étant donné qu'il s'agit d'OpenGL, les performances sont probablement importantes. Il est donc probablement sûr de supposer que cela a été fait pour des raisons de performances.
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 à virgule flottante non sécurisée. En d'autres termes:
en raison d'erreurs d'arrondi en virgule flottante.
Ainsi, alors que les compilateurs modernes peuvent être suffisamment intelligents pour effectuer cette optimisation, ils ne sont pas autorisés à le faire à moins que vous ne le leur disiez explicitement via un indicateur de compilateur.
Connexes: Pourquoi GCC n'optimise-t-il pas * a * a * a * a * a à (a * a * a) * (a * a * a)?
la source
a = b * (1.0f / 255)
; les compilateurs font toujours un pliage constant, n'est-ce pas?0.0 - 0.996
place de celui souhaité0.0 - 1.0
. (0.996 = 255/256
où255
est le plus grand entier 8 bits)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 dans la plage de 0 à 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)
.la source