我最近一直在阅读一篇在线文章,以学习现代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语句。
答案 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
或它不起作用。