133 lines
4.2 KiB
Plaintext
133 lines
4.2 KiB
Plaintext
|
[gd_resource type="ShaderMaterial" load_steps=7 format=2]
|
||
|
|
||
|
[sub_resource type="Shader" id=1]
|
||
|
code = "shader_type spatial;
|
||
|
render_mode skip_vertex_transform, unshaded, blend_add;
|
||
|
|
||
|
uniform float lod = 0.0;
|
||
|
uniform float stretch_to_aspect = 0.5;
|
||
|
|
||
|
uniform int ghosts = 4;
|
||
|
uniform float ghost_dispersal = 0.5;
|
||
|
uniform float halo_width = 0.25;
|
||
|
uniform float distort = 0.25;
|
||
|
|
||
|
uniform float bloom_scale = 10.0;
|
||
|
uniform float bloom_bias = 0.95;
|
||
|
|
||
|
uniform float streak_strength = 1.0;
|
||
|
|
||
|
uniform int distortion_quality : hint_range(0, 2);
|
||
|
|
||
|
uniform sampler2D lens_color;
|
||
|
uniform sampler2D lens_dirt;
|
||
|
uniform sampler2D starburst;
|
||
|
|
||
|
void vertex() {
|
||
|
POSITION = vec4(VERTEX, 1.0);
|
||
|
POSITION.z = -1.0;
|
||
|
}
|
||
|
|
||
|
float weight(vec2 pos) {
|
||
|
float w = length(vec2(0.5) - pos) / length(vec2(0.5));
|
||
|
return pow(1.0 - w, 5.0);
|
||
|
}
|
||
|
|
||
|
vec3 bloomtex(sampler2D tex, vec2 texcoord) {
|
||
|
return max(vec3(0.0), textureLod(tex, texcoord, lod).rgb - bloom_bias) * bloom_scale;
|
||
|
}
|
||
|
|
||
|
vec3 textureDistorted(sampler2D tex, vec2 texcoord, vec2 direction, float distortion) {
|
||
|
vec3 color = vec3(0);
|
||
|
float divisor = 1.0;
|
||
|
color.r += bloomtex(tex, texcoord - direction * distortion).r;
|
||
|
color.g += bloomtex(tex, texcoord).g;
|
||
|
color.b += bloomtex(tex, texcoord + direction * distortion).b;
|
||
|
|
||
|
if(distortion_quality == 1) {
|
||
|
color.rg += bloomtex(tex, texcoord - direction * distortion * 0.5).rg * vec2(1.0, 0.5);
|
||
|
color.gb += bloomtex(tex, texcoord + direction * distortion * 0.5).gb * vec2(0.5, 1.0);
|
||
|
divisor = 2.0;
|
||
|
} else if(distortion_quality == 2) {
|
||
|
color.rg += bloomtex(tex, texcoord - direction * distortion * 0.667).rg * vec2(1.0, 0.333);
|
||
|
color.rg += bloomtex(tex, texcoord - direction * distortion * 0.333).rg * vec2(1.0, 0.667);
|
||
|
color.gb += bloomtex(tex, texcoord + direction * distortion * 0.333).gb * vec2(0.667, 1.0);
|
||
|
color.gb += bloomtex(tex, texcoord + direction * distortion * 0.667).gb * vec2(0.333, 1.0);
|
||
|
divisor = 3.0;
|
||
|
}
|
||
|
|
||
|
return color / divisor;
|
||
|
}
|
||
|
|
||
|
void fragment() {
|
||
|
vec2 texcoord = 1.0 - SCREEN_UV;
|
||
|
vec2 ghostVec = (vec2(0.5) - texcoord) * ghost_dispersal;
|
||
|
|
||
|
float pixelSizeX = 1.0 / float(textureSize(SCREEN_TEXTURE, 0).x);
|
||
|
|
||
|
float distortion = pixelSizeX * distort;
|
||
|
vec2 direction = normalize(ghostVec);
|
||
|
|
||
|
// Ghosts
|
||
|
vec3 result = vec3(0.0);
|
||
|
for(int i = 0; i < ghosts; ++i) {
|
||
|
vec2 offset = fract(texcoord + ghostVec * float(i));
|
||
|
result += textureDistorted(SCREEN_TEXTURE, offset, direction, distortion * weight(offset)) * weight(offset);
|
||
|
}
|
||
|
result *= texture(lens_color, vec2(length(vec2(0.5) - texcoord) / length(vec2(0.5)), 0)).rgb;
|
||
|
|
||
|
// Halo
|
||
|
vec2 aspect = vec2(1.0, mix(1.0, VIEWPORT_SIZE.x / VIEWPORT_SIZE.y, stretch_to_aspect));
|
||
|
vec2 haloVec = normalize(ghostVec / aspect) * aspect * halo_width;
|
||
|
result += textureDistorted(SCREEN_TEXTURE, texcoord + haloVec, direction, distortion) * weight(fract(texcoord + haloVec));
|
||
|
|
||
|
// Starburst
|
||
|
vec2 centerVec = SCREEN_UV - vec2(0.5);
|
||
|
float d = length(centerVec);
|
||
|
float radial = acos(centerVec.x / d);
|
||
|
|
||
|
float starOffset = dot(CAMERA_MATRIX[2].xyz, vec3(1.0)) * 10.0;
|
||
|
float star =
|
||
|
texture(starburst, vec2(radial + starOffset)).r
|
||
|
* texture(starburst, vec2(radial + starOffset * 0.5)).r;
|
||
|
star = clamp(star + (1.0 - smoothstep(0.0, 0.3, d)), 0.0, 1.0);
|
||
|
result *= mix(0.5, star, streak_strength);
|
||
|
|
||
|
ALBEDO = result * mix(texture(lens_dirt, texcoord).rgb, vec3(0.5), 0.4);
|
||
|
|
||
|
//uncomment to debug bright point extraction
|
||
|
//ALBEDO = bloomtex(SCREEN_TEXTURE, SCREEN_UV).rgb;
|
||
|
}"
|
||
|
|
||
|
[sub_resource type="Gradient" id=2]
|
||
|
colors = PoolColorArray( 0.774481, 0.756324, 0.309654, 1, 0.890625, 0.125, 1, 1 )
|
||
|
|
||
|
[sub_resource type="GradientTexture" id=3]
|
||
|
gradient = SubResource( 2 )
|
||
|
|
||
|
[sub_resource type="StreamTexture" id=4]
|
||
|
flags = 7
|
||
|
|
||
|
[sub_resource type="OpenSimplexNoise" id=5]
|
||
|
period = 2.0
|
||
|
|
||
|
[sub_resource type="NoiseTexture" id=6]
|
||
|
height = 1
|
||
|
noise = SubResource( 5 )
|
||
|
|
||
|
[resource]
|
||
|
shader = SubResource( 1 )
|
||
|
shader_param/lod = 0.0
|
||
|
shader_param/stretch_to_aspect = 0.0
|
||
|
shader_param/ghosts = 7
|
||
|
shader_param/ghost_dispersal = 1.19
|
||
|
shader_param/halo_width = 0.692
|
||
|
shader_param/distort = 6.57
|
||
|
shader_param/bloom_scale = 0.294
|
||
|
shader_param/bloom_bias = 7.295
|
||
|
shader_param/streak_strength = 1.0
|
||
|
shader_param/distortion_quality = null
|
||
|
shader_param/lens_color = SubResource( 3 )
|
||
|
shader_param/lens_dirt = SubResource( 4 )
|
||
|
shader_param/starburst = SubResource( 6 )
|