Pergunta

Preciso mapear um valor escalar para cores que varia de 0 a 1.Irá de VERDE a VERMELHO (de 0 a 1) Interpolação Linear usando as coordenadas de textura (também varia de 0 a 1)

Sou novo em OpenGL e GLSL, até agora descobri que preciso escrever o valor da cor em

gl_FragColor

que é um vetor de dimensão 4.Não tenho certeza de como posso calcular os canais R, G e B para gl_FragColor apenas por um valor escalar que varia de 0 a 1,0 (será de VERDE a VERMELHO e em 0,5 será BRANCO)

Foi útil?

Solução

#version 120

...

float remap( float minval, float maxval, float curval )
{
    return ( curval - minval ) / ( maxval - minval );
} 

...

const vec4 GREEN = vec4( 0.0, 1.0, 0.0, 1.0 );
const vec4 WHITE = vec4( 1.0, 1.0, 1.0, 1.0 );
const vec4 RED   = vec4( 1.0, 0.0, 0.0, 1.0 );

float u = <whatever, grabbed from a uniform?>;
u = clamp( u, 0.0, 1.0 );
if( u < 0.5 )
    gl_FragColor = mix( GREEN, WHITE, remap( 0.0, 0.5, u ) );
else
    gl_FragColor = mix( WHITE, RED, remap( 0.5, 1.0, u ) );

Ou você pode experimentar uma textura 1D de 3 pixels.

Outras dicas

Se o seu valor no intervalo de 0 a 1 for nomeado val:

if (val < 0.5)
{
    gl_FragColor = vec4(2.0 * val, 1.0, 2.0 * val, 1.0);
}
else
{
    gl_FragColor = vec4(1.0, 2.0 * (1.0 - val), 2.0 * (1.0 - val), 1.0);
}

Ou se você quiser evitar instruções de ramificação:

gl_FragColor = vec4(min(2.0 * val, 1.0),
                    min(2.0 * (1.0 - val), 1.0), 
                    2.0 * min(val, 1.0 - val),
                    1.0);

Não tenho certeza se isso seria realmente mais rápido.Conforme apontado por @Jessy, isso pode ser simplificado se o buffer de cores tiver um formato normalizado, porque as cores de saída são automaticamente fixadas em um intervalo [0, 1] nesse caso, tornando alguns dos min chamadas desnecessárias:

gl_FragColor = vec4(2.0 * val,
                    2.0 * (1.0 - val), 
                    2.0 * min(val, 1.0 - val),
                    1.0);

Você não precisa se preocupar com fixação manual, porque gl_FragColor é fixado entre 0-1.

float red = 2. * texel;
float green = 2. - red;
gl_FragColor = vec4(red, green, min(red, green), 1.);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top