shader_type canvas_item; // === ЭКРАННАЯ ТЕКСТУРА (обязательно для Godot 4) === uniform sampler2D screen_texture : hint_screen_texture; // === НАСТРОЙКИ === uniform float aberration_strength : hint_range(0.0, 0.02) = 0.003; uniform float scanline_intensity : hint_range(0.0, 1.0) = 0.25; uniform float scanline_count = 320.0; uniform float vignette_strength : hint_range(0.0, 1.0) = 0.3; uniform float color_saturation : hint_range(0.0, 2.0) = 0.7; uniform float brightness : hint_range(-0.5, 0.5) = 0.0; uniform float contrast : hint_range(0.5, 1.5) = 1.1; uniform float opacity : hint_range(0.0, 1.0) = 1.0; uniform bool enable_scanlines = true; uniform bool enable_vignette = true; uniform bool enable_aberration = true; void fragment() { vec2 uv = UV; // === ХРОМАТИЧЕСКАЯ АБЕРРАЦИЯ === vec3 color; if (enable_aberration && aberration_strength > 0.0) { vec2 center = vec2(0.5, 0.5); vec2 dir = uv - center; float dist = length(dir); vec2 offset = normalize(dir) * dist * aberration_strength; float r = texture(screen_texture, uv + offset).r; float g = texture(screen_texture, uv).g; float b = texture(screen_texture, uv - offset).b; color = vec3(r, g, b); } else { color = texture(screen_texture, uv).rgb; } // === СКАНЛАЙНЫ === if (enable_scanlines && scanline_intensity > 0.0) { float scanline = sin(uv.y * scanline_count * 3.14159265); scanline = scanline * 0.5 + 0.5; scanline = pow(scanline, 1.2); color *= 1.0 - (scanline * scanline_intensity * 0.5); } // === ВИНЬЕТКА === if (enable_vignette && vignette_strength > 0.0) { vec2 center_uv = uv - 0.5; float vignette = dot(center_uv, center_uv) * 4.0; vignette = 1.0 - (vignette * vignette_strength * 0.7); vignette = clamp(vignette, 0.0, 1.0); color *= vignette; } // === НАСЫЩЕННОСТЬ ЦВЕТА === if (color_saturation != 1.0) { float gray = dot(color, vec3(0.299, 0.587, 0.114)); color = mix(vec3(gray), color, color_saturation); } // === ЯРКОСТЬ И КОНТРАСТ === color = (color - 0.5) * contrast + 0.5; color += brightness; color = clamp(color, 0.0, 1.0); // === ИТОГОВЫЙ ЦВЕТ С ПРОЗРАЧНОСТЬЮ === COLOR = vec4(color, opacity); }