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

Posted

技术标签:

【中文标题】未触发opengl片段着色器条件语句【英文标题】:opengl fragment shader conditional statement not triggered 【发布时间】:2012-03-27 22:32:57 【问题描述】:

我正在通过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】:

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

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

一般来说,您永远不应该测试浮点数的相等性。也就是说,等于另一个值。

即使它完全相等,它也只会发生一次。所以它只在一帧上是正确的;下一帧,当currLerp是0.95f什么的时候,又会是false。

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


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

你设置了这个标志。然后你有两个if 语句,一个在标志为真时执行,一个在标志为假时执行。这是一种浪费和糟糕的编码风格。几乎所有带有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);

【讨论】:

感谢您对风格的批评。也许您也可以评论一下如何达到我想要的效果? @Paul:如果我只想给你答案,I wouldn't have assigned it as Further Study ;) if (currLerp

以上是关于未触发opengl片段着色器条件语句的主要内容,如果未能解决你的问题,请参考以下文章

条件语句会减慢着色器的速度吗?

片段着色器中未使用纹理数据 - OpenGL

OpenGL 片段着色器未写入 fbo 颜色缓冲区

Xcode 7 / iOS 9:在 SKNode 中使用 OpenGL 片段着色器未编译

使用制服时 Xamarin OpenGL 片段着色器的奇怪行为

Opengl着色器:如果条件错误地评估为假