2014-06-05 48 views
2

我需要將標量值映射到範圍爲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

您是使用1D紋理還是採用> = 2D UV的標量? – Jessy

+0

2D紋理中的每個像素都會給出從0到1的值。 – ammar26

+0

好吧。座標與當時的問題無關。 – Jessy

回答

1
#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紋理。

+1

永遠不要在fs中分支也不是絕對可以避免的。即使是最現代化的硬件碎片也是以4個塊爲單位進行評估的,並且所有分支或其中任何一個分支都會強制gpu對每個碎片進行評估,而不管是否需要。此外,這完全是關於一致性。接近另一個的碎片應該儘可能「一致」(採用相同的分支),因爲這可能導致僅運行必要的分支。 – RecursiveExceptionException

+0

爲了解決避免分支的問題,應該總是使用'mix','step','smoothstep'等函數,因爲它們更快,即使分支儘可能一致。當然,有些情況並非如此,但一般來說,這些建議值得黃金分析。 – RecursiveExceptionException

3

如果你的範圍爲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); 
2

您不必擔心手動夾緊,因爲gl_FragColor夾在0-1之間。

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

確實如此,至少只要顏色緩衝區具有標準化格式,就可以簡化。我沒有想到這一點。 –