我需要将范围在0到1之间的标量值映射到颜色。它将从绿色到红色(从0到1)使用纹理坐标进行线性插值。
我对OpenGL和GLSL不熟悉,目前我已经发现我需要在HTML标签中写入颜色值。
我对OpenGL和GLSL不熟悉,目前我已经发现我需要在HTML标签中写入颜色值。
gl_FragColor
这是一个四维向量。我不确定如何通过一个从0到1.0范围内变化的标量值来计算gl_FragColor的R、G和B通道(它将从绿色变为红色,在0.5时将为白色)。
gl_FragColor
这是一个四维向量。我不确定如何通过一个从0到1.0范围内变化的标量值来计算gl_FragColor的R、G和B通道(它将从绿色变为红色,在0.5时将为白色)。
#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 ) );
或者您可以采样一个3像素的1D纹理。
mix
、step
、smoothstep
等函数,因为它们即使分支尽可能一致,也比分支更快。当然,也有一些特殊情况不适用于这个建议,但总体而言,这个建议非常有价值。 - RecursiveExceptionException如果您在0到1的范围内的值被命名为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);
}
或者,如果您想避免使用分支语句:
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);
不确定这是否实际上会更快。正如@Jessy所指出的那样,如果颜色缓冲区具有归一化格式,则可以简化此过程,因为在这种情况下,输出颜色会自动夹紧到[0,1]范围内,从而使一些min
调用变得不必要:
gl_FragColor = vec4(2.0 * val,
2.0 * (1.0 - val),
2.0 * min(val, 1.0 - val),
1.0);
您不需要担心手动夹紧,因为gl_FragColor在0-1之间被夹紧。
float red = 2. * texel;
float green = 2. - red;
gl_FragColor = vec4(red, green, min(red, green), 1.);