Domanda

Ho bisogno di mappare un valore scalare al colore che varia da 0 a 1. Passerà da verde a rosso (da 0 a 1) interpolazione lineare utilizzando le coordinate texture (anche da 0 a 1) Sono nuovo a OpenGL e GLSL, finora ho capito che ho bisogno di scrivere il valore del colore in

gl_FragColor
.

che è un vettore di dimensione 4. Non sono sicuro di come posso calcolare i canali R, G e B per GL_FragColor solo da un valore scalare che varia da 0 a 1,0 (sarà da verde al rosso ea 0,5Sarà bianco)

È stato utile?

Soluzione

#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 potresti assaggiare una trama 1D a 3 pixel.

Altri suggerimenti

Se il valore compreso nell'intervallo da 0 a 1 è denominato 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 se si desidera evitare dichiarazioni di filiali:

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

Non sono sicuro se questo sarebbe effettivamente più veloce.Come sottolineato da @jessy, questo può essere semplificato se il buffer colore ha un formato normalizzato, poiché i colori di uscita vengono automaticamente bloccati a un intervallo [0, 1] in tal caso, rendendo un paio di chiamate min non necessarie:

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

Non è necessario preoccuparsi del serraggio manuale, poiché GL_FRAGCOLOR è bloccato tra 0-1.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top