mirror of
https://github.com/Orama-Interactive/Pixelorama.git
synced 2025-01-31 15:39:49 +00:00
62 lines
1.4 KiB
GLSL
62 lines
1.4 KiB
GLSL
shader_type canvas_item;
|
|
render_mode unshaded;
|
|
|
|
uniform bool red;
|
|
uniform bool blue;
|
|
uniform bool green;
|
|
uniform bool alpha;
|
|
uniform sampler2D selection;
|
|
|
|
float stolChannel(float x) {
|
|
return (x < 0.04045) ? (x / 12.92) : pow((x + 0.055) / 1.055, 2.4);
|
|
}
|
|
|
|
vec3 standardToLinear(vec3 c) {
|
|
return vec3(
|
|
stolChannel(c.r),
|
|
stolChannel(c.g),
|
|
stolChannel(c.b));
|
|
}
|
|
|
|
float ltosChannel(float x) {
|
|
return (x > 0.0031308) ? (pow(x, 1.0 / 2.4) * 1.055 - 0.055) : (x * 12.92);
|
|
}
|
|
|
|
vec3 linearToStandard(vec3 c) {
|
|
return vec3(
|
|
ltosChannel(c.r),
|
|
ltosChannel(c.g),
|
|
ltosChannel(c.b));
|
|
}
|
|
|
|
float luminance(vec3 lin) {
|
|
return 0.21264935 * lin.r
|
|
+ 0.71516913 * lin.g
|
|
+ 0.07218152 * lin.b;
|
|
}
|
|
|
|
void fragment() {
|
|
// Get color from the sprite texture at the current pixel we are rendering
|
|
vec4 original_color = texture(TEXTURE, UV);
|
|
vec4 selection_color = texture(selection, UV);
|
|
|
|
// Transform from standard RGB to linear RGB.
|
|
vec3 std = original_color.rgb;
|
|
vec3 lin = standardToLinear(std);
|
|
|
|
// Find the y component of linear RGB to XYZ transformation.
|
|
float lum = luminance(lin);
|
|
vec3 des = vec3(
|
|
red ? lum : lin.r,
|
|
green ? lum : lin.g,
|
|
blue ? lum : lin.b);
|
|
vec3 stdPrime = linearToStandard(des);
|
|
|
|
vec3 output = mix(original_color.rgb, stdPrime, selection_color.a);
|
|
|
|
if (alpha) {
|
|
COLOR = vec4(output.rgb, ltosChannel(lum));
|
|
} else {
|
|
COLOR = vec4(output.rgb, original_color.a);
|
|
}
|
|
} |