Использование условных операторов для отскока между цветами, а не выскакивания


Недавно я читал онлайн-статью, чтобы изучить основы современного 3D-программирования OpenGL, и я застрял на одном из обзоров "независимой практики". Вопрос гласит:

В fragChangeColor.cpp, измените его так, чтобы фрагмент программы отскакивал между firstColor и 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, если заявление.

1 3

1 ответ:

Ты слишком много думаешь. Вот ваш функциональный график

И пример кода:

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/ Просто скопируйте код и нажмите compile (маленький значок в левом верхнем углу панели source)

Но оставил этот блок нетронутым:

#ifdef GL_ES
precision highp float;
#endif

Или это не сработает.