Sigo viendo esta ventana emergente constante en varios archivos de encabezado de gráficos
0.0039215689
Parece que tiene algo que ver con el color, tal vez?
Aquí está el primer éxito en 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
¿Qué representa este número? ¿Por qué nadie parece declararlo como una constante?
No pude encontrar nada en Google que lo explicara.
c
floating-point
constants
magic-numbers
Persona especial
fuente
fuente
(1.f/255)
?1/255 == 0.00(3921568627450980)
- Parens significa repetición.Respuestas:
0.0039215689
es aproximadamente igual a1/255
.Al ver que esto es OpenGL, el rendimiento es probablemente importante. Por lo tanto, es seguro adivinar que esto se hizo por razones de rendimiento.
Multiplicar por el recíproco es más rápido que dividir repetidamente por 255.
Nota al margen:
Si se está preguntando por qué no se deja esa microoptimización al compilador, es porque es una optimización de punto flotante insegura. En otras palabras:
debido a errores de redondeo de punto flotante.
Por lo tanto, si bien los compiladores modernos pueden ser lo suficientemente inteligentes como para hacer esta optimización, no se les permite hacerlo a menos que se lo indique explícitamente a través de un indicador del compilador.
Relacionado: ¿Por qué GCC no optimiza a * a * a * a * a * a a (a * a * a) * (a * a * a)?
fuente
a = b * (1.0f / 255)
; los compiladores siguen haciendo plegados constantes, ¿no?0.0 - 0.996
lugar del deseado0.0 - 1.0
. (0.996 = 255/256
donde255
es el número entero de 8 bits más grande)Esta multiplicación por
0.0039215689f
convierte una intensidad de color con valor entero en el rango de 0 a 255 a una intensidad de color con valor real en el rango de 0 a 1.Como señala Ilmari Karonen, incluso si se trata de una optimización, está bastante mal expresada. Sería mucho más claro multiplicar por
(1.0f/255)
.fuente