From a76f583c2d11043a94c3251ec6a5381d7836bdb4 Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Thu, 13 Nov 2025 22:04:56 -0500 Subject: Add TCG --- crates/renderer/src/assets/shaders/flat/frag.glsl | 3 -- .../renderer/src/assets/shaders/tcg_base/frag.glsl | 60 ++++++++++++++++++++++ .../renderer/src/assets/shaders/tcg_base/vert.glsl | 4 ++ .../src/assets/shaders/tcg_screen/frag.glsl | 7 +-- 4 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 crates/renderer/src/assets/shaders/tcg_base/frag.glsl create mode 100644 crates/renderer/src/assets/shaders/tcg_base/vert.glsl (limited to 'crates/renderer/src/assets/shaders') diff --git a/crates/renderer/src/assets/shaders/flat/frag.glsl b/crates/renderer/src/assets/shaders/flat/frag.glsl index cab840d..69fe2ec 100644 --- a/crates/renderer/src/assets/shaders/flat/frag.glsl +++ b/crates/renderer/src/assets/shaders/flat/frag.glsl @@ -7,9 +7,6 @@ void main() float opacity = 1.0 - clamp(transparency, 0.0, 1.0); vec2 tcfull = vec2(vertex_texcoord.x, 1.0 - vertex_texcoord.y); vec4 texel = texture(texture_data, tcfull); - if (texel.a != 1.0) { - discard; - } texel.a *= opacity; frag_color = texel; } diff --git a/crates/renderer/src/assets/shaders/tcg_base/frag.glsl b/crates/renderer/src/assets/shaders/tcg_base/frag.glsl new file mode 100644 index 0000000..b941d61 --- /dev/null +++ b/crates/renderer/src/assets/shaders/tcg_base/frag.glsl @@ -0,0 +1,60 @@ +uniform sampler2D texture_data; + +uniform vec4 shift_color; + +vec3 rgb_to_hsl(vec3 rgb) { + vec3 ret; + float min = min(min(rgb.r, rgb.g), rgb.b); + float max = max(max(rgb.r, rgb.g), rgb.b); + float lum = (max + min) / 2.0; + ret.z = lum; + if (max == min) { + ret.x = ret.y = 0.0; + } else { + float chroma = max - min; + ret.y = chroma / (1.0 - abs(2.0 * lum - 1.0)); + if (max == rgb.r) { + ret.x = (rgb.g - rgb.b) / chroma + (rgb.g < rgb.b ? 6.0 : 0.0); + } else if (max == rgb.g) { + ret.x = (rgb.b - rgb.r) / chroma + 2.0; + } else { + ret.x = (rgb.r - rgb.g) / chroma + 4.0; + } + ret.x /= 6.0; + } + return ret; +} + +float hue_to_rgb(float p, float q, float t) { + if (t < 0.0) t += 1.0; + if (t > 1.0) t -= 1.0; + if (t < 1.0/6.0) return p + (q - p) * 6.0 * t; + if (t < 1.0/2.0) return q; + if (t < 2.0/3.0) return p + (q - p) * (2.0/3.0 - t) * 6.0; + return p; +} + +vec3 hsl_to_rgb(vec3 hsl) { + vec3 ret; + if (hsl.y == 0.0) { + ret.r = ret.g = ret.b = hsl.z; + } else { + float q = hsl.z < 0.5 ? hsl.z * (1.0 + hsl.y) : hsl.z + hsl.y - hsl.z * hsl.y; + float p = 2.0 * hsl.z - q; + ret.r = hue_to_rgb(p, q, hsl.x + 1.0/3.0); + ret.g = hue_to_rgb(p, q, hsl.x); + ret.b = hue_to_rgb(p, q, hsl.x - 1.0/3.0); + } + return ret; +} + +void main() +{ + vec2 tcfull = vec2(vertex_texcoord.x, 1.0 - vertex_texcoord.y); + vec4 texel = texture(texture_data, tcfull); + vec3 hsl = rgb_to_hsl(texel.xyz); + vec3 shift_hsl = rgb_to_hsl(shift_color.xyz); + hsl.x = shift_hsl.x; + texel.xyz = hsl_to_rgb(hsl); + frag_color = texel; +} diff --git a/crates/renderer/src/assets/shaders/tcg_base/vert.glsl b/crates/renderer/src/assets/shaders/tcg_base/vert.glsl new file mode 100644 index 0000000..e324f7e --- /dev/null +++ b/crates/renderer/src/assets/shaders/tcg_base/vert.glsl @@ -0,0 +1,4 @@ +void main() +{ + default_main(); +} \ No newline at end of file diff --git a/crates/renderer/src/assets/shaders/tcg_screen/frag.glsl b/crates/renderer/src/assets/shaders/tcg_screen/frag.glsl index 2a14860..cb4a58f 100644 --- a/crates/renderer/src/assets/shaders/tcg_screen/frag.glsl +++ b/crates/renderer/src/assets/shaders/tcg_screen/frag.glsl @@ -1,15 +1,12 @@ uniform sampler2D texture_data; -uniform float transparency; - void main() { - float opacity = 1.0 - clamp(transparency, 0.0, 1.0); vec2 tcfull = vec2(vertex_texcoord.x, vertex_texcoord.y); vec4 texel = texture(texture_data, tcfull); - if (texel.a != 1.0) { + if (texel.a == 0.0) { discard; } - texel.a *= opacity; + texel.a = 1.0; frag_color = texel; } -- cgit v1.2.3