fix: color-accurate grade — ginger hair stays ginger, characters stay matte

The saturation grade (1.3) was shifting authored hues — Taila's auburn
ginger hair rendered fire-truck red and the whole game read filtered.
Saturation 1.3 -> 1.08, contrast 1.05 -> 1.03: textures now carry their
own vibrancy. Verified by sampling the rendered hair against the source
texture: lit hue 18-20 deg vs authored ~20 deg.

Character rim/specular cut again (rim 0.15/0.4 -> 0.08/0.32, spec
0.06 -> 0.025 @ 64): hair and cloth read fully matte, no wet sheen.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
Nicholas Butzke
2026-07-20 22:55:58 -04:00
co-authored by Claude Fable 5
parent 1ad3563e5a
commit d46530bd8c
3 changed files with 20 additions and 17 deletions
+6 -4
View File
@@ -104,11 +104,13 @@ static func make_environment(sky_variant: String = "day") -> Environment:
environment.glow_bloom = 0.05
environment.glow_hdr_threshold = 1.45
# Cel color grade: punchy saturation, hint of contrast (bumped a touch to
# make up for filmic's slightly tamer mids — vibrancy stays).
# Cel color grade: a LIGHT saturation lift only. Anything stronger shifts
# hues — authored ginger hair grades into fire-truck red, pastels go neon —
# and the whole game reads "filtered". Let the textures' own colors carry
# the vibrancy.
environment.adjustment_enabled = true
environment.adjustment_saturation = 1.3
environment.adjustment_contrast = 1.05
environment.adjustment_saturation = 1.08
environment.adjustment_contrast = 1.03
# A touch of depth haze for scale; far enough to not gray the arena.
environment.fog_enabled = true
+7 -7
View File
@@ -85,13 +85,13 @@ static func toonify(src: Material) -> Material:
mat.set_shader_parameter("has_texture", tex != null)
mat.set_shader_parameter("use_triplanar", false)
mat.set_shader_parameter("albedo_color", col)
# Matte anime surfaces: a thin rim for silhouette pop and a small tight
# glint. The old hot rim (0.45 over 65% width) + broad specular made
# every character and prop read as wet plastic / a colored mirror.
mat.set_shader_parameter("rim_strength", 0.15)
mat.set_shader_parameter("rim_width", 0.4)
mat.set_shader_parameter("specular_strength", 0.06)
mat.set_shader_parameter("specular_shininess", 56.0)
# Matte anime surfaces: a whisper of rim for silhouette pop, near-zero
# specular. Characters should read as cloth/hair, not vinyl — any hotter
# and dark surfaces gloss up and light hair looks wet.
mat.set_shader_parameter("rim_strength", 0.08)
mat.set_shader_parameter("rim_width", 0.32)
mat.set_shader_parameter("specular_strength", 0.025)
mat.set_shader_parameter("specular_shininess", 64.0)
return mat