Ithaca High School Math Seminar Lesson 2-5
Date: 2023.11.15
The images we've made so far are static, i.e. they do not change with time. Today we'll start making dynamic animations.
Step 1: Parametrize the radius
Let's begin by using something we basically made in the previous lesson.
The image above is produced by the following shader code.
#version 330
uniform vec2 resolution;
void main(void)
{
float screen_ratio = resolution.y / resolution.x;
float xc = 2 * gl_FragCoord.x / resolution.x - 1;
xc /= screen_ratio;
float yc = 2 * gl_FragCoord.y / resolution.y - 1;
vec4 color1 = vec4(xc,yc,1,1);
vec4 color2 = vec4(0.8,0.8,0.8,1);
bool in_R = xc * xc + yc * yc <= 0.25;
gl_FragColor = float(in_R) * color1 + float(! in_R) * color2;
}
The 0.25 here controls the size of the circle. We can make this value adjustable with a slider. First, in the right sidebar, click on the Project tab, and scroll down until you find the Parameters bar. Click the + icon (pictured below). This will open a drop-down menu; choose Constant → Float → Float.
Scroll down to the bottom of the right sidebar; there should be options for a variable titled value1 (illustrated below). Change the name of value1 to radius by clicking on the text value1. Adjust the range of this variable by clicking on the bottom-right square with the filled-in dot (the bottom-right icon in the image below); set the range from to 0 to 1.
To use this variable, we should declare it as a uniform. Below or after the line uniform vec2 resolution; add in:
uniform float radius;
Now replace the 0.25 in the code with radius, and then slide the gray / dark gray bar in the radius options. The disk should change in size!
Step 2: Use the built-in uniform time
The last step was a fairly general method of defining and setting variables in fragment shaders we want to manually adjust. Kodelife comes with some built-in uniforms, one of which is time.
To use it, we only need change the line that we added from
uniform float radius;to
uniform float time;
We can now use this variable to create a radius which varies. For example, taking sin(time) would return a value between -1 and 1. Before the line in the fragment shader code where the bool in_R is declared and set, then, we could add in the line
float radius = 1 + sin(time);
which would have the affect of periodically varying the radius from 0 to 2.
Task: Modify the code so that the radius of the disk varies over time.
A creative and often satisfying experience is making up your own animations.
Final Task: On your own or in a group, make a short and simple animation. (E.g. A disk which moves in a circle; a triangle which rotates over time.)