[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 )