使用条件语句在与弹出相对的颜色之间反弹

时间:2012-11-16 01:40:33

标签: opengl glsl conditional-statements vertex-shader

我最近一直在阅读一篇在线文章,以学习现代3D OpenGL编程的绳索,并且我正陷入其中一个“独立实践”的评论中。问题是:

  

在fragChangeColor.cpp中,更改它以使片段程序反弹   在firstColor和secondColor之间,而不是从中弹出   secondColor在循环结束时返回第一个。该   第一到第二到第一次过渡都应该在一个单一的过程中发生   fragLoopDuration时间间隔。万一你想知道,GLSL   支持if语句,以及?:运算符。奖金   但是,如果没有明确的条件陈述,那么就这样做;感觉   可以自由地使用sin或cos函数来执行此操作。

我遇到的麻烦是使用条件语句在两种颜色之间反弹,我对GLSL着色器语言知之甚少。下面的代码会慢慢增加三角形的颜色,直到达到最大值,然后将颜色恢复为白色。

#version 330

out vec4 outputColor;

uniform float fragLoopDuration;
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()
{
    float currTime = mod(time, fragLoopDuration); //makes the color pop from green to white once mod goes from 5 to 0 again
    float currLerp = currTime / fragLoopDuration;

    outputColor = mix(firstColor, secondColor, currLerp);
}

在该代码的某处我需要包含某种条件语句,这样一旦三角形颜色达到它的最大值,它将开始减少颜色直到它达到白色,然后再次最大颜色,依此类推。我该怎么做呢?我最初的猜测是使用某种静态bool if语句。

1 个答案:

答案 0 :(得分:2)

你过分思考它。这是您的function plot

代码示例:

uniform float time;

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

void main()
{
   float lerp = abs(sin(time));
   gl_FragColor = mix(firstColor, secondColor, lerp);
}

您可以在线测试http://www.iquilezles.org/apps/shadertoy/只需复制过去的代码并按下编译(源面板左上角的小图标)

但完好无损地保留了这个区块:

#ifdef GL_ES
precision highp float;
#endif

或它不起作用。