Pregunta

Necesito asignar un valor escalar a un color que oscila entre 0 y 1.Pasará de VERDE a ROJO (de 0 a 1) Interpolación lineal utilizando las coordenadas de la textura (también varía de 0 a 1)

Soy nuevo en OpenGL y GLSL, hasta ahora he descubierto que necesito escribir el valor del color en

gl_FragColor

que es un vector de dimensión 4.No estoy seguro de cómo puedo calcular los canales R, G y B para gl_FragColor solo con un valor escalar que oscila entre 0 y 1,0 (será de VERDE a ROJO y en 0,5 será BLANCO)

¿Fue útil?

Solución

#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 ) );

o podría probar una textura 1D 1D de 3 píxeles.

Otros consejos

Si su valor en el rango de 0 a 1 se llama 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);
}

O si desea evitar declaraciones de rama:

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);

No estoy seguro de si esto sería realmente más rápido.Como señaló @Jessy, esto se puede simplificar si el búfer de color tiene un formato normalizado, porque en ese caso los colores de salida se fijan automáticamente en un rango [0, 1], lo que hace un par de min llamadas innecesarias:

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

No tiene que preocuparse por la sujeción manual, porque GL_FRAGCOLOR está sujeta entre 0-1.

float red = 2. * texel;
float green = 2. - red;
gl_FragColor = vec4(red, green, min(red, green), 1.);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top