Ciągle widzę tę stałą wyskakującą w różnych plikach nagłówka grafiki
0.0039215689
Może to ma coś wspólnego z kolorem?
Oto pierwsze trafienie w 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
Co oznacza ten numer? Dlaczego nikt nie wydaje się deklarować tego jako const?
Nie mogłem znaleźć w Google niczego, co by to wyjaśniało.
c
floating-point
constants
magic-numbers
zmiażdżyć
źródło
źródło
(1.f/255)
?1/255 == 0.00(3921568627450980)
- parens oznacza powtórzenie.Odpowiedzi:
0.0039215689
jest w przybliżeniu równy1/255
.Ponieważ jest to OpenGL, wydajność jest prawdopodobnie ważna. Prawdopodobnie bezpiecznie zgadnąć, że zrobiono to ze względu na wydajność.
Mnożenie przez odwrotność jest szybsze niż wielokrotne dzielenie przez 255.
Dygresja:
Jeśli zastanawiasz się, dlaczego taka mikrooptymalizacja nie została pozostawiona kompilatorowi, to dlatego, że jest to niebezpieczna optymalizacja zmiennoprzecinkowa. Innymi słowy:
z powodu błędów zaokrąglania zmiennoprzecinkowego.
Chociaż współczesne kompilatory mogą być na tyle inteligentne, aby przeprowadzić tę optymalizację, nie mogą tego robić, chyba że wyraźnie powiesz im to za pomocą flagi kompilatora.
Powiązane: Dlaczego GCC nie optymalizuje * a * a * a * a * a do (a * a * a) * (a * a * a)?
źródło
a = b * (1.0f / 255)
; kompilatory wciąż wykonują ciągłe składanie, prawda?0.0 - 0.996
pożądanego0.0 - 1.0
. (0.996 = 255/256
gdzie255
jest największa 8-bitowa liczba całkowita)To pomnożenie przez
0.0039215689f
konwertuje intensywność koloru o wartości całkowitej w zakresie od 0 do 255 na rzeczywistą intensywność koloru w zakresie od 0 do 1.Jak podkreśla Ilmari Karonen, nawet jeśli jest to optymalizacja, jest ona raczej źle wyrażona. Mnożenie byłoby znacznie łatwiejsze
(1.0f/255)
.źródło