2012-03-27 106 views
0

我經歷的教程在http://arcsynthesis.org/gltut/Positioning/Tut03%20More%20Power%20To%20The%20Shaders.htmlOpenGL的片段着色器的條件語句不觸發

我目前在它創建了一個三角形,在圓周方向移動,並顏色逐漸改變從白色到綠色的一課。完成一個循環後,顏色將跳回白色。我試圖讓顏色從白色逐漸變成綠色,然後再逐漸變回。 我的條件語句設置我的顏色改變方向似乎從來沒有評估爲真,所以我的改變從未生效。

這是我的片段着色器。

#version 330 

out vec4 outputColor; 

uniform float fragLoopDuration; //5.0f 
uniform float time; 


const vec4 firstColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); 
const vec4 secondColor = vec4(0.0f, 1.0f, 0.0f, 1.0f); 

void main() 
{ 
    bool myFlag = false; //flag will indicate which direction color change will take. 
    float currTime = mod(time, fragLoopDuration); 
    float currLerp = currTime/fragLoopDuration; //currLerp range = (0.0f-1.0f) 
    if (currLerp == 0.9f) myFlag = !myFlag; //this flag is not geting triggered. 
    if (myFlag) outputColor = mix(secondColor, firstColor, currLerp * -1.0f + 1.0f); //green to white 
    if (!myFlag) outputColor = mix(firstColor, secondColor, currLerp); //white to green 
} 
+0

所以...什麼是你的問題? – 2012-03-27 23:09:23

+0

對不起,問題是我的條件語句設置我的國旗似乎從來沒有評估爲真。因此,我對顏色的期望改變從未發生過。 – Paul 2012-03-27 23:11:07

回答

2

對不起,問題是我的條件語句設置自己的旗幟似乎永遠不會計算爲true。

你期望什麼?爲了使currLerp正好等於0.9f,currTimefragLoopDuration必須非常具體並且非常具有確切值。如果currTime甚至略微偏離,甚至0.000001,那麼currLerp將不會完全等於0.9f,因此您的條件將永遠不會成立。

一般來說,你不應該測試一個浮點數爲等於。也就是說,等於另一個值。

即使它完全相等,也只會發生一次。所以在一個框架上它會是真的;下一幀,當currLerp是0.95f什麼的時候,它會再次失真。

我猜你的意思是>=而不是==


順便說一句,您的代碼的結構並不像大多數程序員那樣做。

你有這個標誌,你設置。然後,您有兩個if語句,如果該標記爲true,將執行一個語句,如果該標記爲false,則會執行一個語句。這是一種浪費和糟糕的編碼風格。幾乎所有使用if的語言都會有某種形式的else:如果條件不成立,就會發生這種情況。

標準的方式做,這是在這裏:

if (myFlag) 
    outputColor = mix(secondColor, firstColor, currLerp * -1.0f + 1.0f); 
else 
    outputColor = mix(firstColor, secondColor, currLerp); 

既然你只使用myFlag一次,有沒有點甚至具有可變:

if (currLerp == 0.9f) //Fix this, of course 
    outputColor = mix(secondColor, firstColor, currLerp * -1.0f + 1.0f); 
else 
    outputColor = mix(firstColor, secondColor, currLerp); 
+0

謝謝你的風格批判。也許你也可以評論如何達到我想要的效果? – Paul 2012-03-27 23:35:34

+0

@Paul:如果我打算給你答案,[我不會把它作爲進一步研究](http://stackoverflow.com/users/734069/nicol-bolas);) – 2012-03-27 23:49:35

+0

if(currLerp <0。5f)outputColor = mix(secondColor,firstColor,currLerp); else outputColor = mix(firstColor,secondColor,currLerp); 這帶來了一個平穩的過渡,但是由於從未達到完整的currLerp值,綠色的顏色強度受到影響。這是否滿足要求或者是否有其他解決方案? – Paul 2012-03-28 01:29:41