46 lines
1.3 KiB
Plaintext
46 lines
1.3 KiB
Plaintext
![]() |
shader_type spatial;
|
||
|
render_mode diffuse_burley, specular_schlick_ggx, blend_mix;
|
||
|
|
||
|
group_uniforms albedo;
|
||
|
uniform vec4 albedo : source_color = vec4(1.0, 1.0, 1.0, 0.0);
|
||
|
uniform sampler2D albedo_texture : source_color, hint_default_white;
|
||
|
|
||
|
group_uniforms roughness;
|
||
|
uniform float roughness : hint_range(0.0, 1.0) = 0.15;
|
||
|
uniform sampler2D roughness_texture : hint_roughness_r;
|
||
|
|
||
|
group_uniforms normal;
|
||
|
uniform float normal_strength : hint_range(-16.0, 16.0) = 1.0;
|
||
|
uniform sampler2D normal_map : hint_normal;
|
||
|
|
||
|
group_uniforms misc;
|
||
|
uniform vec4 edge_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
|
||
|
|
||
|
float SchlickFresnel(float u) {
|
||
|
float m = 1.0 - u;
|
||
|
float m2 = m * m;
|
||
|
return m2 * m2 * m;
|
||
|
}
|
||
|
|
||
|
void fragment() {
|
||
|
// calculate fresnel values
|
||
|
float VdotN = dot(VIEW, NORMAL);
|
||
|
float fresnel = clamp(SchlickFresnel(VdotN), 0.0, 1.0);
|
||
|
|
||
|
// sample and mix textures
|
||
|
vec4 _albedo = texture(albedo_texture, UV) * albedo;
|
||
|
float _roughness = texture(roughness_texture, UV).r * roughness;
|
||
|
|
||
|
// apply glass look
|
||
|
float a = mix(0.001, 1.0, _albedo.a);
|
||
|
ALPHA = mix(fresnel * edge_color.a, 1.0, a);
|
||
|
ALBEDO = mix(edge_color.rgb * edge_color.a, _albedo.rgb, a);
|
||
|
|
||
|
ROUGHNESS = _roughness;
|
||
|
NORMAL_MAP = texture(normal_map, UV).xyz;
|
||
|
NORMAL_MAP_DEPTH = normal_strength;
|
||
|
|
||
|
// function to compensate specular for alpha blend
|
||
|
// 0.5 * ALPHA^-0.5
|
||
|
SPECULAR = 0.5 * inversesqrt(ALPHA);
|
||
|
}
|