batrix/shaders/cel_shader/includes/anisotropy.gdshaderinc
2025-02-27 02:08:29 +10:00

56 lines
1.4 KiB
Plaintext

#include "base_cel_shader.gdshaderinc"
group_uniforms Anisotropy;
uniform float anisotropy_ratio: hint_range(-1,1) = 0.0;
uniform vec3 anisotropy_direction = vec3(0.0, -1.0, 0.0);
uniform float aniso_map_dir_ratio: hint_range(0,1) = 0.0;
uniform sampler2D anisotropy_flowmap: hint_anisotropy;
uniform float specular_smoothness = 0.05;
group_uniforms;
varying vec3 ANISOTROPY_DIR;
varying float ANISOTROPY_RATIO;
struct AnisotropyData {
vec3 direction;
float ratio;
};
AnisotropyData anisotropy_fragment(vec2 uv) {
return AnisotropyData(
mix(
normalize(anisotropy_direction),
texture(anisotropy_flowmap, uv).rgb * 2.0 - 1.0,
aniso_map_dir_ratio
),
anisotropy_ratio * texture(anisotropy_flowmap, uv).a
);
}
vec3 anisotropy_specular(
vec3 light_color,
vec3 specular_color,
float specular_strength,
vec3 normal,
vec3 view,
vec3 light,
float attenuation,
vec2 uv,
vec3 aniso_dir,
float aniso_ratio
) {
vec3 half = normalize(view + light);
float aniso = max(0, sin(dot(normalize(normal + aniso_dir), half) * PI));
float spec = mix(dot(normal, half), aniso, aniso_ratio);
float spec_gloss = pow(2.0, 8.0 * (1.0 - specular_strength));
float spec_intensity = smoothstep(
0.05,
0.05 + specular_smoothness,
pow(spec, spec_gloss * spec_gloss)
);
return light_color
* specular_color
* spec_intensity
* is_lit(light, normal, attenuation);
}