Use Godot's GLSL dialect for color grading and more. This is a downsized fork of Fragmented.
Find a file
2025-10-10 22:05:07 +02:00
build-template Add modified Fragmented project files 2025-10-10 22:05:07 +02:00
examples Add modified Fragmented project files 2025-10-10 22:05:07 +02:00
shaderlib Add modified Fragmented project files 2025-10-10 22:05:07 +02:00
src Add modified Fragmented project files 2025-10-10 22:05:07 +02:00
tools Add modified Fragmented project files 2025-10-10 22:05:07 +02:00
.gitattributes Initial commit 2025-10-10 22:00:01 +02:00
.gitignore Initial commit 2025-10-10 22:00:01 +02:00
dist.sh Add modified Fragmented project files 2025-10-10 22:05:07 +02:00
export_presets.cfg Add modified Fragmented project files 2025-10-10 22:05:07 +02:00
LICENSE Initial commit 2025-10-10 22:00:01 +02:00
project.godot Add modified Fragmented project files 2025-10-10 22:05:07 +02:00
README.md Add modified Fragmented project files 2025-10-10 22:05:07 +02:00
screenshot.png Add modified Fragmented project files 2025-10-10 22:05:07 +02:00

Pigment

screenshot

Color grading with code.

Table of Contents

Supported Platforms

  • Linux

You can find the latest release ...

Usage

With Pigment, you are processing images with GDShaders. This brings almost endless opportunities to create unique art.
If you want to learn GDShader, take a look at the Godot docs.

To get started, use the project template (see the Releases section of this repo) and open it in Godot.

The template includes many examples. You can use them as a starting-point to write your own stuff.

Besides the regular GDShader stuff, Pigment has so-called directives. Those allow to further control the behaviour of the application. The most important directive is //!load to load an image.

Load TEXTURE using the //!load directive

//!load <filepath>

The main image file will be read and available as the sampler2D TEXTURE.

Load additional images

//!load+ <name> <filepath>

uniform sampler2D <name>;

Have a look at the place_texture.gdshader example.

Have multiple steps with //!steps n

You can apply your shaderfile multiple times. At every additional step, TEXTURE is the result of the previous step. This can be used to chain effects that cannot be easily chained otherwise.

To query the current step index, a STEP uniform is automatically injected. If steps is set to 0, your shader won't be applied at all.

Example:

//!load ...
//!steps 5

uniform int STEP;
uniform int STEPS;

void fragment() {
  if (STEP == 0) {
	  ...
  } else if (STEP == 1) {
	  ...
  } else if (STEP == STEPS-1) {
    ...
  }
}

Shaderlib

This repo comes with a (still small) shader library including pre-written functions and more.
Have a look at the shaderlib folder.

Here is an example:

shader_type canvas_item;

#include "./shaderlib/oklab.gdshaderinc"

//!load ./images/swamp.jpg

void fragment() {
	vec4 oklab = rgb2oklab(COLOR);
	vec4 oklch = oklab2oklch(oklab);
	oklch.z -= 2.0;
	COLOR = oklab2rgb(oklch2oklab(oklch));
}

Commandline interface

You can run Pigment from the commandline or scripts.

Note: Headless mode is not supported. Using the commandline interface still opens a window.

Usage

~ Pigment CLI ~
-================-

Usage:

./Pigment <command> <args...>

Commands:

 help

  | Shows this help text.

 apply --shader PATH --input PATH --output PATH

  | Applies a shader file.

    --shader PATH  The path to the shader
    --input  PATH  The path to the input image.
                   Passing a folder activates batch mode.
    --output PATH  Where to write the resulting image to.
                   In batch mode, this must be a folder.

Batch Mode

Since version v8.0, you can pass a directory to --input and --output. This will process all images in the input directory and write the output to the output directory.

Note: You can use this feature for video frames, but it will take a loooong time.

Examples

./Pigment apply --shader ./examples/oklab.gdshader --input ~/Pictures/test.png --output ./output.png

Known Issues

  • screen scaling is unsupported; Using screen scaling could lead to an either blurry UI, or no scaling at all -> see #45
  • commandline interface: --headless is not supported