Eu continuo vendo essa constante aparecer em vários arquivos de cabeçalho de gráficos
0.0039215689
Parece ter algo a ver com cor, talvez?
Aqui está o primeiro hit no 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
O que esse número representa? Por que ninguém parece declarar isso como uma const?
Não consegui encontrar nada no Google que explicasse isso.
c
floating-point
constants
magic-numbers
A paixão súbita
fonte
fonte
(1.f/255)
?1/255 == 0.00(3921568627450980)
parens significa repetição.Respostas:
0.0039215689
é aproximadamente igual a1/255
.Como esse é o OpenGL, o desempenho é provavelmente importante. Portanto, é provavelmente seguro adivinhar que isso foi feito por razões de desempenho.
Multiplicar pela recíproca é mais rápido do que dividir repetidamente por 255.
Nota:
Se você está se perguntando por que essa micro-otimização não é deixada para o compilador, é porque é uma otimização de ponto flutuante insegura. Em outras palavras:
devido a erros de arredondamento de ponto flutuante.
Portanto, embora os compiladores modernos possam ser inteligentes o suficiente para fazer essa otimização, eles não podem fazê-lo, a menos que você os indique explicitamente por meio de um sinalizador do compilador.
Relacionado: Por que o GCC não otimiza a * a * a * a * a * a para (a * a * a) * (a * a * a)?
fonte
a = b * (1.0f / 255)
; compiladores ainda fazem dobragem constante, não é?0.0 - 0.996
do desejado0.0 - 1.0
. (0.996 = 255/256
onde255
é o maior número inteiro de 8 bits)Essa multiplicação
0.0039215689f
converte uma intensidade de cor com valor inteiro no intervalo de 0 a 255 em uma intensidade de cor com valor real no intervalo de 0 a 1.Como Ilmari Karonen ressalta, mesmo que essa seja uma otimização, ela é muito mal expressa. Seria muito mais claro multiplicar por
(1.0f/255)
.fonte