summaryrefslogtreecommitdiffstats
path: root/mat_palette.gdshader
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2025-11-26 12:47:12 +0200
committerJan Tuomi <jan@jantuomi.fi>2025-11-26 12:47:12 +0200
commit864722c02a36b860de23c52277f56d2692dff111 (patch)
tree1e1c6e83aac74d1928f73bd0d6a96d801d0b2196 /mat_palette.gdshader
parent5adc7200bd684447ba8e65bbb088d3379c00e91c (diff)
Add some screen shader stuff
Diffstat (limited to 'mat_palette.gdshader')
-rw-r--r--mat_palette.gdshader54
1 files changed, 54 insertions, 0 deletions
diff --git a/mat_palette.gdshader b/mat_palette.gdshader
new file mode 100644
index 0000000..e24a6ee
--- /dev/null
+++ b/mat_palette.gdshader
@@ -0,0 +1,54 @@
+shader_type canvas_item;
+
+uniform vec4 palette_0 : source_color;
+uniform vec4 palette_1 : source_color;
+uniform vec4 palette_2 : source_color;
+uniform vec4 palette_3 : source_color;
+uniform vec4 palette_4 : source_color;
+uniform vec4 palette_5 : source_color;
+uniform vec4 palette_6 : source_color;
+uniform vec4 palette_7 : source_color;
+uniform vec4 palette_8 : source_color;
+uniform vec4 palette_9 : source_color;
+uniform vec4 palette_10 : source_color;
+uniform vec4 palette_11 : source_color;
+
+const int N_COLORS = 12;
+
+uniform sampler2D screen_texture : hint_screen_texture;
+
+void fragment() {
+ vec4 palette[N_COLORS] = { palette_0, palette_1, palette_2, palette_3, palette_4, palette_5, palette_6, palette_7, palette_8, palette_9, palette_10, palette_11 };
+ vec4 screen_color = texture(screen_texture, SCREEN_UV);
+ // Compute source color value
+ float sv = 0.f;
+ for (int i = 0; i < 3; i++) {
+ if (screen_color[i] > sv) { sv = screen_color[i]; }
+ }
+
+ int pal_i = int(floor((sv * 0.99f) * float(N_COLORS)));
+ vec4 result = palette[pal_i];
+ /*
+ float min_dist = 999.f; // always bigger than 1.0
+ vec4 result;
+ for (int i = 0; i < N_COLORS; i++) {
+ vec4 pc = palette[i];
+ // Compute palette color value
+ float pv = 0.f;
+ for (int j = 0; j < 3; j++) {
+ if (pc[j] > pv) { pv = pc[j]; }
+ }
+ float dist = abs(pv - sv);
+ if (dist < min_dist) {
+ min_dist = dist;
+ result = pc;
+ }
+ }
+ */
+ COLOR = vec4(result.rgb, COLOR.a);
+}
+
+//void light() {
+// // Called for every pixel for every light affecting the CanvasItem.
+// // Uncomment to replace the default light processing function with this one.
+//}