Files
seeding-planets/common/vfx/materials/shaders/3d_outline_2.gdshader
Zacharie Guet 908878dff4 Dev de la démo
* Modification de l'apparence de l'UI des dialogues
* Changement de l'ordre de déblocage des mutations
* Ajout d'une confirmation pour l'abandon
* Ajout de la scène de fin avec la base Boréa, en tant que fin de démo
* Modification des icône de durée de vie, temps de pousse, et de mort
* Ajout d'un icône au dessus du joueur quand il n'a plus d'énergie
* Amélioration des dialogues du jeu
* Changement du modèle du téléphone
* Ajout de cellule d'énergie et de cellule de talion trouvable sur la carte
* Il est à nouveau possible de se recharger après la fin d'une région
* Buff des mutations ancien sociale et solide
* Modification de la mutation fertile (ne donne de gain de graine qu'à la maturation)
* Ajout d'une récupération automatique des graines
* Ajout de deux cartons de tutoriel ainsi qu'une option pour les revoir dans l'aide de jeu
* Amélioration générale du tutoriel
* Ajout d'un écran titre digne de ce nom
* Lors de l'arrivée à destination, ne téléporte plus le joueur sur une map vide, mais directement dans les lieux de cinématique
* Ajout graphique de plus de pattern de mousse et de roche
* Le talion apparait maintenant sur toute la carte
* La roche peut désormais apparaitre sur la zone de départ
* Ajout dud modificateur de région Canyon
* Equilibrage général
* Fix de bugs en tout genre
2026-05-27 19:13:32 +02:00

56 lines
2.1 KiB
Plaintext

shader_type spatial;
render_mode blend_premul_alpha, unshaded, ambient_light_disabled;
uniform sampler2D depth_texture : hint_depth_texture;
uniform int step_count : hint_range(3, 15, 2) = 3; // 2 samples per step
uniform float thickness : hint_range(1.0, 16.0, 0.1) = 3.0;
uniform vec3 edge_color : source_color = vec3(0.);
uniform float fade_start : hint_range(1.0, 1000.0, 0.1) = 100.0;
uniform float fade_length : hint_range(1.0, 1000.0, 0.1) = 200.0;
void fragment() {
// Setup step parameters
vec2 step_length = 1.0 / VIEWPORT_SIZE * thickness;
float step_angle = TAU / float(step_count);
// Per-pixel jitter to reduce patterning
float start_angle = fract(sin(dot(SCREEN_UV, vec2(12.9898, 78.233))) * 43758.5453) * TAU;
vec2 dir = vec2(cos(start_angle), sin(start_angle));
// step rotation matrix
mat2 rot = mat2(
vec2(cos(step_angle), -sin(step_angle)),
vec2(sin(step_angle), cos(step_angle)));
vec3 avg_dx = vec3(0.0);
vec3 avg_dy = vec3(0.0);
// save closest pixel to uniformly fade line.
float min_z = 1e6;
// Sample and average derivatives for all pairs
for (int i = 0; i < step_count; i++) {
vec2 uv1 = SCREEN_UV + dir * step_length;
vec2 uv2 = SCREEN_UV - dir * step_length;
float d1 = texture(depth_texture, uv1).r;
float d2 = texture(depth_texture, uv2).r;
vec4 up1 = INV_PROJECTION_MATRIX * vec4(uv1 * 2.0 - 1.0, d1, 1.0);
vec4 up2 = INV_PROJECTION_MATRIX * vec4(uv2 * 2.0 - 1.0, d2, 1.0);
vec3 p1 = up1.xyz / up1.w;
vec3 p2 = up2.xyz / up2.w;
min_z = min(min_z, min(-p1.z, -p2.z));
vec3 diff = p1 - p2;
avg_dx += diff * dir.x;
avg_dy += diff * dir.y;
dir = rot * dir; // rotate direction for next step
}
// fade outline width with distance
float distance_fade = 1e-4 + smoothstep(fade_start + fade_length, fade_start, min_z);
// Edge mask
float edge = 1.0 - smoothstep(0.03, 0.05, dot(normalize(cross(avg_dy, avg_dx)), VIEW));
// Small vignette at screen edges
edge *= smoothstep(0.00, 0.015 * thickness,
1.0 - max(abs(SCREEN_UV.x - 0.5), abs(SCREEN_UV.y - 0.5)) * 2.0);
// blend_premul_alpha avoids need to sample screentexture.
ALBEDO = edge_color * edge;
ALPHA = edge * distance_fade;
}