Использование условных операторов для отскока между цветами, а не выскакивания
Недавно я читал онлайн-статью, чтобы изучить основы современного 3D-программирования OpenGL, и я застрял на одном из обзоров "независимой практики". Вопрос гласит:
Проблема в том, что я использую условный оператор для перехода между двумя цветами, у меня ограниченные знания языка шейдеров GLSL. Следующий код медленно увеличивает цвет треугольника до тех пор, пока не достигнет максимума, и всплывает цвет вернемся к белому.В fragChangeColor.cpp, измените его так, чтобы фрагмент программы отскакивал между firstColor и secondColor, а не выскакивать из второй цвет возвращается к первому в конце цикла. То переход от первого ко второму к первому должен происходить в пределах одного время fragLoopDuration интервал. На случай, если вам интересно, GLSL поддерживает утверждение if, а также ?: оператор. На бонусы пункты однако, сделайте это без явного условного утверждения; почувствуйте свободно использовать функцию sin или cos для этого.
#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 ответ:
Ты слишком много думаешь. Вот ваш функциональный график
И пример кода:
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
Или это не сработает.