Shaders Guide

Fragment Shaders

You can think of the fragment shader as a function that runs on each for each pixel that the target mesh is covering. For example, the GDScript version of a fragment shader that sets the color looks like this:

for x in range(width):
  for y in range(height):
    set_color(x, y, some_color)

As you can see, it loops over each pixel in the range, and sets it to be some_color. The shader version of this would be:

void fragment() {
  COLOR = some_color;
}

The fragment shader automatically loops over each pixel in the range, and the COLOR variable of the pixel gets set to some_color.

The COLOR Variable

This variable is defined as a four-dimensional vector, which is just a list of four numbers. In terms of COLOR, the four parts are r, g, b, and a, which represent the different color channels in a pixel. However, these parts can also be accessed with x, y, z, and w, in that order. The purpose of this naming convention will be explained in .

In gGLSL, vectors can be created using the vecx() functions, where x is the dimension of the vector (ex. vec3() for a three-dimensional vector).

Try putting this statement inside of your fragment shader:

COLOR = vec4(0.0, 0.0, 1.0, 1.0);

To break this down, the first parameter of vec4() is the r value, which in this case is 0.0, which means there's nothing in the red channel of the pixel. The second parameter is the g value, which is also 0.0, which means nothing in the green channel. The b parameter is 1.0, meaning the blue channel is full. The last value is for the alpha channel, which is also full. The resulting vector represents a blue color, since only the blue and alpha channels have parts.

Normally in computer graphics, these values are expressed as an integer between 0 and 255, but gGLSL expresses these values as a floating-point value between 0 and 1.

Just like in GDScript (and other programming languages), you can also get existing variables, along with setting them. Try putting this statement in your fragment shader:

COLOR = vec4(COLOR.r, 1.0, COLOR.b, COLOR.a);

This shader leaves the existing red, blue, and alpha channels, and sets the green channel to 1.0, resulting in a very green Godot. Alternatively, you can simply use this statement for the same result:

COLOR.g = 1.0;

After all, COLOR is just a vector, and each part can be changed by itself.

This topic covers the very basics of fragment shaders in 2D, and the next topic will cover a more advanced use of this shader: UV Maps.