3

我最近一直在阅读一篇在线文章以了解现代 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 语句。

4

1 回答 1

2

你想多了。这是你的函数图

和代码示例:

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

否则将无法正常工作。

于 2012-11-16T03:41:10.767 回答