44 lines
1.3 KiB
Plaintext
44 lines
1.3 KiB
Plaintext
shader_type spatial;
|
|
render_mode unshaded, cull_disabled;
|
|
|
|
// From ChatGPT since I'm not that good at shaders (and for a debug visualizer it's okay).
|
|
|
|
uniform vec4 base_color : source_color = vec4(0.3, 1.0, 0.3, 0.12);
|
|
uniform vec4 edge_color : source_color = vec4(1.0, 1.0, 0.5, 0.7);
|
|
|
|
uniform float edge_power = 2.0;
|
|
|
|
instance uniform vec3 box_center;
|
|
instance uniform vec3 box_extents;
|
|
|
|
void fragment() {
|
|
// Fresnel edge factor (works from inside + outside)
|
|
float ndv = abs(dot(NORMAL, VIEW));
|
|
float fresnel = pow(1.0 - ndv, edge_power);
|
|
fresnel = clamp(fresnel + 0.15, 0.0, 1.0);
|
|
|
|
// Subtle face shading for depth cues
|
|
float lighting = dot(NORMAL, vec3(0.3, 0.7, 0.6)) * 0.5 + 0.5;
|
|
|
|
// Camera distance to box center
|
|
vec3 cam_to_center = CAMERA_POSITION_WORLD - box_center;
|
|
float cam_dist = length(cam_to_center);
|
|
|
|
// Normalize distance (tweak as needed)
|
|
float cam_proximity = clamp(1.0 - cam_dist / 100.0, 0.0, 1.0);
|
|
|
|
// Camera-based tint (blue far → red near)
|
|
vec3 cam_tint = mix(vec3(0.2, 0.6, 1.0), vec3(1.0, 0.3, 0.2), cam_proximity);
|
|
|
|
// Base color + edge highlight
|
|
vec3 color = mix(base_color.rgb, edge_color.rgb, fresnel);
|
|
color *= lighting;
|
|
|
|
// Subtle camera-based tint
|
|
color = mix(color, cam_tint, 0.2 * cam_proximity);
|
|
|
|
float alpha = mix(base_color.a, edge_color.a, fresnel);
|
|
|
|
ALBEDO = color;
|
|
ALPHA = alpha;
|
|
} |