68 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
shader_type spatial;
 | 
						|
// Can't figure out how to make back faces look good
 | 
						|
// Flipping normals doesn't change their shading
 | 
						|
render_mode cull_back, depth_prepass_alpha;
 | 
						|
 | 
						|
//#include "res://addons/vertexanimations/va_default.gdshaderinc"
 | 
						|
#include "res://color.gdshaderinc"
 | 
						|
#include "res://noise.gdshaderinc"
 | 
						|
 | 
						|
 | 
						|
varying float fur_length;
 | 
						|
varying float is_shell;
 | 
						|
varying float shell_id_factor;
 | 
						|
varying vec3 ungroomed_3d_uv;
 | 
						|
varying vec3 groomed_normals;
 | 
						|
 | 
						|
uniform float scale = 700.0;
 | 
						|
uniform float clump_scale = 90.1;
 | 
						|
uniform float grooming_factor = 0.008;
 | 
						|
uniform sampler2D hair_curve_shape : repeat_disable;
 | 
						|
uniform sampler2D hair_stem_shape : repeat_disable;
 | 
						|
uniform sampler2D hair_clump_radius : repeat_disable;
 | 
						|
uniform sampler2D hair_clump_height : repeat_disable;
 | 
						|
uniform sampler2D hair_base_color : source_color;
 | 
						|
uniform sampler2D hair_depth_factor : repeat_disable;
 | 
						|
 | 
						|
uniform sampler2D normals : hint_normal;
 | 
						|
 | 
						|
 | 
						|
void vertex() {
 | 
						|
	fur_length = CUSTOM0.w;
 | 
						|
	shell_id_factor = CUSTOM2.r;
 | 
						|
	ungroomed_3d_uv = CUSTOM0.xzy;
 | 
						|
	ungroomed_3d_uv.z *= -1.0;
 | 
						|
	groomed_normals = CUSTOM1.xzy;
 | 
						|
	groomed_normals.z *= -1.0;
 | 
						|
	is_shell = CUSTOM2.y;
 | 
						|
 | 
						|
	//VERTEX = vertex_animation_default(VERTEX_ID, VERTEX);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
void fragment() {
 | 
						|
	if (is_shell <= 0.0001) {
 | 
						|
		discard;
 | 
						|
	}
 | 
						|
	float curve_shape = texture(hair_curve_shape, vec2(1.0-shell_id_factor)).r;
 | 
						|
	float groom_weight = (((1.0-fur_length)*grooming_factor) + grooming_factor) * curve_shape;
 | 
						|
	vec3 groomed_3d_uv = ungroomed_3d_uv + (groomed_normals * groom_weight);
 | 
						|
 | 
						|
	float clump_radius = 1.0-texture(hair_clump_radius, vec2(shell_worley(groomed_3d_uv, clump_scale))).r;
 | 
						|
	float clump_height = texture(hair_clump_height, vec2(clump_radius)).r;
 | 
						|
	float clump_shell_id = shell_id_factor / clump_height;
 | 
						|
	float stem_shape = texture(hair_stem_shape, vec2(clump_shell_id)).r;
 | 
						|
	float c = shell_worley(groomed_3d_uv, scale);
 | 
						|
	if (c > stem_shape) {
 | 
						|
		discard;
 | 
						|
	}
 | 
						|
	vec3 sample_hair_base_color = COLOR.rgb;
 | 
						|
	vec3 base = rgb2hsv(sample_hair_base_color);
 | 
						|
	float v = base.z * texture(hair_depth_factor, vec2(shell_id_factor)).r;
 | 
						|
	ALBEDO = hsv2rgb(vec3(base.x, base.y, v));
 | 
						|
	ROUGHNESS = 1.0;
 | 
						|
	SPECULAR = 0.0;
 | 
						|
	NORMAL_MAP = texture(normals, UV).xyz;
 | 
						|
}
 |