未触发opengl片段着色器条件语句

时间:2012-03-27 22:32:57

标签: opengl glsl fragment-shader

我正在浏览http://arcsynthesis.org/gltut/Positioning/Tut03%20More%20Power%20To%20The%20Shaders.html

的教程

我目前正在上课,创建一个三角形,沿圆周方向移动,逐渐将颜色从白色变为绿色。完成一个循环后,颜色将跳回白色。我试图让颜色逐渐从白色变为绿色并返回。 我设置颜色变化方向的条件语句似乎永远不会评估为真,所以我的更改永远不会生效。

这是我的片段着色器。

#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
}

1 个答案:

答案 0 :(得分:2)

  

很抱歉,问题是我的条件声明设置我的标志似乎永远不会评估为真。

你期待什么?为了使currLerp 完全等于0.9f,currTimefragLoopDuration必须非常具体且非常精确值。如果currTime甚至略微偏离,甚至是0.000001,则currLerp将不会完全等于0.9f,因此您的条件永远不会成立。

通常,您不应该为 equality 测试浮点数。也就是说,等于另一个值。

即使它完全相同,它也只会发生一次。所以它恰好在一帧上是真的; <{1}}为0.95f之后的下一帧,它将再次为假。

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


顺便说一句,你的代码的结构不像大多数程序员那样。

您已设置此标志。然后你有两个==语句,一个在标志为真时执行,另一个在标志为假时执行。这是一种浪费和糟糕的编码风格。几乎所有if的语言都会有某种形式的if:如果条件不正确就会发生这种情况。

执行此操作的标准方法是:

else

由于你只使用if (myFlag) outputColor = mix(secondColor, firstColor, currLerp * -1.0f + 1.0f); else outputColor = mix(firstColor, secondColor, currLerp); 一次,所以即使有一个变量也没有意义:

myFlag