Opengl 片段着色器GLSL中的颜色插值?

Opengl 片段着色器GLSL中的颜色插值?,opengl,glsl,shader,fragment-shader,gpu,Opengl,Glsl,Shader,Fragment Shader,Gpu,我需要将标量值映射到范围为0到1的颜色。它将使用纹理坐标(也从0到1)从绿色到红色(从0到1)线性插值 我是OpenGL和GLSL的新手,到目前为止,我已经知道我需要在中写入颜色值 gl_FragColor 这是一个维数为4的向量。我不确定如何仅通过一个范围为0到1.0(从绿色到红色,0.5为白色)的标量值来计算gl\u FragColor的R、G和B通道 ... 浮点重新映射(浮点最小值、浮点最大值、浮点曲线) { 返回(curval-minval)/(maxval-minval); }

我需要将标量值映射到范围为0到1的颜色。它将使用纹理坐标(也从0到1)从绿色到红色(从0到1)线性插值

我是OpenGL和GLSL的新手,到目前为止,我已经知道我需要在中写入颜色值

gl_FragColor
这是一个维数为4的向量。我不确定如何仅通过一个范围为0到1.0(从绿色到红色,0.5为白色)的标量值来计算gl\u FragColor的R、G和B通道 ... 浮点重新映射(浮点最小值、浮点最大值、浮点曲线) { 返回(curval-minval)/(maxval-minval); } ... 常数vec4绿色=vec4(0.0,1.0,0.0,1.0); const vec4 WHITE=vec4(1.0,1.0,1.0,1.0); 常数vec4 RED=vec4(1.0,0.0,0.0,1.0); 浮动u=; u=夹具(u,0.0,1.0); 如果(u<0.5) gl_FragColor=混合(绿色、白色、重映射(0.0、0.5、u)); 其他的 gl_FragColor=混合(白色、红色、重映射(0.5、1.0、u));
或者可以对3像素1D纹理进行采样。

如果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);
}
不确定这是否会更快。正如@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.);

您使用的是1D纹理,还是从>=2D UV中获取标量?2D纹理中的每个像素都给出0到1Okay的值。坐标与问题无关。很遗憾,我从2D纹理像素中得到的标量值毫无意义。你声称有一个从0到1的单一纹理坐标(到目前为止这是有意义的),但是你提到了一个2D纹理。。。从2D纹理中查找值需要两个坐标,除非假设另一个是常量(在这种情况下,1D纹理更有意义)。没错,至少只要颜色缓冲区具有规范化格式,它就可以简化。我没有想到这一点。永远不要在财政司司长分支不是绝对可以避免的。即使是在最现代的硬件上,碎片也是以4块为单位进行评估的,所有这些碎片中的分支都会强制gpu对每个碎片进行评估,而不管是否需要。此外,这一切都与连贯性有关。靠近另一个片段的片段应尽可能“连贯”(采用相同的分支),因为这可能只会导致运行必要的分支。要解决避免分支的问题,应始终使用诸如
mix
step
smoothstep
、等函数,等,因为即使分支尽可能连贯,它们也会更快。当然,在某些情况下这是不正确的,但一般来说,建议是值得的。
gl_FragColor = vec4(2.0 * val,
                    2.0 * (1.0 - val), 
                    2.0 * min(val, 1.0 - val),
                    1.0);
float red = 2. * texel;
float green = 2. - red;
gl_FragColor = vec4(red, green, min(red, green), 1.);