我需要將標量值映射到範圍爲0到1的顏色。它將從綠色變爲紅色(從0到1)使用紋理座標進行線性插值(範圍從0到1)Fragment Shader GLSL中的顏色插值?
我是新的OpenGL和GLSL,到目前爲止,我想通了,我需要寫在
gl_FragColor
是尺寸4的向量我不知道我怎麼能計算出R色值, G和B通道的gl_FragColor只是一個範圍爲0到1.0的標量值(它將從綠色變爲紅色並且在0.5它將變爲白色)
我需要將標量值映射到範圍爲0到1的顏色。它將從綠色變爲紅色(從0到1)使用紋理座標進行線性插值(範圍從0到1)Fragment Shader GLSL中的顏色插值?
我是新的OpenGL和GLSL,到目前爲止,我想通了,我需要寫在
gl_FragColor
是尺寸4的向量我不知道我怎麼能計算出R色值, G和B通道的gl_FragColor只是一個範圍爲0到1.0的標量值(它將從綠色變爲紅色並且在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紋理。
永遠不要在fs中分支也不是絕對可以避免的。即使是最現代化的硬件碎片也是以4個塊爲單位進行評估的,並且所有分支或其中任何一個分支都會強制gpu對每個碎片進行評估,而不管是否需要。此外,這完全是關於一致性。接近另一個的碎片應該儘可能「一致」(採用相同的分支),因爲這可能導致僅運行必要的分支。 – RecursiveExceptionException
爲了解決避免分支的問題,應該總是使用'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.);
確實如此,至少只要顏色緩衝區具有標準化格式,就可以簡化。我沒有想到這一點。 –
您是使用1D紋理還是採用> = 2D UV的標量? – Jessy
2D紋理中的每個像素都會給出從0到1的值。 – ammar26
好吧。座標與當時的問題無關。 – Jessy