未触发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,currTime
和fragLoopDuration
必须是非常具体且非常准确的值。如果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片段着色器条件语句的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 7 / iOS 9:在 SKNode 中使用 OpenGL 片段着色器未编译