parent
7286f76b86
commit
6485f3d5f9
@ -0,0 +1,21 @@ |
|||||||
|
[gd_resource type="Shader" format=2] |
||||||
|
|
||||||
|
[resource] |
||||||
|
code = "// Edge-Detection Shader Pass 1 |
||||||
|
// Here we simply pass the vertex normals to the albedo |
||||||
|
// so we can access it through the SCREEN_TEXTURE in our Shader Pass 2 |
||||||
|
// LICENSE: MIT |
||||||
|
|
||||||
|
shader_type spatial; |
||||||
|
render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_toon,specular_disabled,shadows_disabled; |
||||||
|
|
||||||
|
varying vec3 world_normal; |
||||||
|
|
||||||
|
void vertex() { |
||||||
|
world_normal = NORMAL; |
||||||
|
} |
||||||
|
|
||||||
|
void fragment() { |
||||||
|
ALBEDO = world_normal.rgb; |
||||||
|
} |
||||||
|
" |
||||||
@ -0,0 +1,57 @@ |
|||||||
|
[gd_resource type="Shader" format=2] |
||||||
|
|
||||||
|
[resource] |
||||||
|
code = "// Edge-Detection Shader Pass 2 |
||||||
|
// Here's our fully lit and shaded model, |
||||||
|
// but through the SCREEN_TEXTURE, we also have the world normals |
||||||
|
// of all the visible parts of our model that the first pass gives us. |
||||||
|
// LICENSE: MIT |
||||||
|
|
||||||
|
shader_type spatial; |
||||||
|
render_mode blend_mix,depth_draw_alpha_prepass,cull_back,diffuse_lambert,specular_disabled; |
||||||
|
uniform vec4 albedo : hint_color; |
||||||
|
uniform sampler2D texture_albedo : hint_albedo; |
||||||
|
uniform float specular; |
||||||
|
uniform float metallic; |
||||||
|
uniform float roughness : hint_range(0,1); |
||||||
|
uniform float edge_strength : hint_range(0,1) = 0.2; |
||||||
|
uniform vec4 edge_color : hint_color = vec4(0.5, 0.5, 0.5, 1.0); |
||||||
|
|
||||||
|
// essentially a cheap \"lightness\" function |
||||||
|
// returns the average of red, green and blue color channels |
||||||
|
float vec3_avg(vec3 color) { |
||||||
|
return (color.r + color.g + color.b) / 3.0; |
||||||
|
} |
||||||
|
|
||||||
|
// transform a pixel coordinate to screen UV |
||||||
|
vec2 pixel_to_screen_uv(vec2 viewport_size, vec2 pixel) { |
||||||
|
return vec2(pixel.x / viewport_size.x, pixel.y / viewport_size.y); |
||||||
|
} |
||||||
|
|
||||||
|
void fragment() { |
||||||
|
vec4 albedo_tex = texture(texture_albedo, UV); |
||||||
|
|
||||||
|
vec2 iuv = vec2(SCREEN_UV.x * VIEWPORT_SIZE.x, SCREEN_UV.y * VIEWPORT_SIZE.y); |
||||||
|
|
||||||
|
vec3 neighbour_left = texture(SCREEN_TEXTURE, pixel_to_screen_uv(VIEWPORT_SIZE, iuv + vec2(0, 0))).rgb; |
||||||
|
vec3 neighbour_right = texture(SCREEN_TEXTURE, pixel_to_screen_uv(VIEWPORT_SIZE, iuv + vec2(0.5, 0))).rgb; |
||||||
|
|
||||||
|
vec3 neighbour_top = texture(SCREEN_TEXTURE, pixel_to_screen_uv(VIEWPORT_SIZE, iuv + vec2(0, 0.0))).rgb; |
||||||
|
vec3 neighbour_bottom = texture(SCREEN_TEXTURE, pixel_to_screen_uv(VIEWPORT_SIZE, iuv + vec2(0, 0.5))).rgb; |
||||||
|
|
||||||
|
ALBEDO = albedo.rgb * texture(texture_albedo, UV).rgb; |
||||||
|
|
||||||
|
// compare normals: if they differ, we draw an edge |
||||||
|
// by mixing in the edge_color, by edge_strength amount |
||||||
|
// feel free to try other ways to mix, such as multiply for more textured objects. |
||||||
|
if (abs(vec3_avg(neighbour_left) - vec3_avg(neighbour_right)) > 0.0) { |
||||||
|
ALBEDO = mix(ALBEDO, edge_color.rgb, edge_strength); |
||||||
|
}else if (abs(vec3_avg(neighbour_top) - vec3_avg(neighbour_bottom)) > 0.0) { |
||||||
|
ALBEDO = mix(ALBEDO, edge_color.rgb, edge_strength); |
||||||
|
} |
||||||
|
|
||||||
|
METALLIC = metallic; |
||||||
|
ROUGHNESS = roughness; |
||||||
|
SPECULAR = specular; |
||||||
|
} |
||||||
|
" |
||||||
@ -0,0 +1,63 @@ |
|||||||
|
[gd_resource type="Shader" format=2] |
||||||
|
|
||||||
|
[resource] |
||||||
|
code = "//THIS SHADER MUST BE APPLIED TO A QUAD (MeshInstance) WITH A SIZE OF (2, 2) |
||||||
|
//Extra Cull Margin on the quad should be turned up all the way! |
||||||
|
|
||||||
|
shader_type spatial; |
||||||
|
render_mode unshaded; |
||||||
|
|
||||||
|
uniform int outline_mode : hint_range(1, 3, 1) = 3; |
||||||
|
uniform float outline_intensity : hint_range(0, 5) = 1; |
||||||
|
uniform bool _round = false; |
||||||
|
uniform float outline_bias : hint_range(-10, 10) = 0; |
||||||
|
|
||||||
|
uniform vec4 outline_color : hint_color = vec4(0.0, 0.0, 0.0, 1.0); |
||||||
|
|
||||||
|
void vertex() { |
||||||
|
POSITION = vec4(VERTEX, 1.0); |
||||||
|
} |
||||||
|
|
||||||
|
void fragment() { |
||||||
|
ALBEDO = outline_color.rgb; |
||||||
|
|
||||||
|
vec2 screen_size = vec2(textureSize(SCREEN_TEXTURE, 1)); |
||||||
|
|
||||||
|
float px = 0.5/screen_size.x; |
||||||
|
float py = 0.5/screen_size.y; |
||||||
|
|
||||||
|
float d = texture(DEPTH_TEXTURE, SCREEN_UV).x; |
||||||
|
float du = texture(DEPTH_TEXTURE, SCREEN_UV+vec2(0.0, py)).x; |
||||||
|
float dd = texture(DEPTH_TEXTURE, SCREEN_UV+vec2(0.0, -py)).x; |
||||||
|
float dr = texture(DEPTH_TEXTURE, SCREEN_UV+vec2(px, 0.0)).x; |
||||||
|
float dl = texture(DEPTH_TEXTURE, SCREEN_UV+vec2(-px, 0.0)).x; |
||||||
|
|
||||||
|
if (outline_mode == 1){ |
||||||
|
ALPHA = 0.0 + abs(abs(d)-abs(du)) + abs(abs(d)-abs(dd)) + abs(abs(d)-abs(dl)) + abs(abs(d)-abs(dr)); |
||||||
|
|
||||||
|
ALPHA *= 1000.0*outline_intensity; |
||||||
|
} else if (outline_mode == 2) { |
||||||
|
ALPHA = 0.0 + abs(abs(abs(d)-abs(du)) - abs(abs(d)-abs(dd))) + abs(abs(abs(d)-abs(dl)) - abs(abs(d)-abs(dr))); |
||||||
|
|
||||||
|
ALPHA *= 3.0*50000.0*outline_intensity; |
||||||
|
} else if (outline_mode == 3) { |
||||||
|
float dq = texture(DEPTH_TEXTURE, SCREEN_UV+vec2(-px, py)).x; |
||||||
|
float de = texture(DEPTH_TEXTURE, SCREEN_UV+vec2(px, py)).x; |
||||||
|
float dz = texture(DEPTH_TEXTURE, SCREEN_UV+vec2(-px, -py)).x; |
||||||
|
float dc = texture(DEPTH_TEXTURE, SCREEN_UV+vec2(px, -py)).x; |
||||||
|
|
||||||
|
ALPHA = 0.0 + abs(abs(abs(d)-abs(du)) - abs(abs(d)-abs(dd))) + abs(abs(abs(d)-abs(dl)) - abs(abs(d)-abs(dr))) + abs(abs(abs(d)-abs(dq)) - abs(abs(d)-abs(dc))) + abs(abs(abs(d)-abs(dz)) - abs(abs(d)-abs(de))); |
||||||
|
|
||||||
|
ALPHA *= 50000.0*outline_intensity; |
||||||
|
} |
||||||
|
|
||||||
|
ALPHA += outline_bias; |
||||||
|
|
||||||
|
if (_round) { |
||||||
|
ALPHA = round(ALPHA); |
||||||
|
} |
||||||
|
|
||||||
|
ALPHA *= outline_color.a; |
||||||
|
} |
||||||
|
|
||||||
|
//Written by Warren Jennings" |
||||||
Binary file not shown.
Loading…
Reference in new issue