#include uniform vec2 uResolution; uniform float uDistortionStrength; uniform float uBlurIntensity; uniform float uDispersion; uniform sampler2D uTexture; uniform vec2 uWidgetOffset; uniform vec2 uTextureSize; out vec4 fragColor; void main() { vec2 fragCoord = FlutterFragCoord(); // 1. محاسبه مختصات UV جهانی vec2 globalPos = fragCoord + uWidgetOffset; vec2 uv = globalPos / uTextureSize; // 2. ساخت ماسک لبه (فقط 8 درصد دور کادر برای لیکویید شدن) vec2 localUV = fragCoord / uResolution; float distToEdgeX = min(localUV.x, 1.0 - localUV.x); float distToEdgeY = min(localUV.y, 1.0 - localUV.y); float distToEdge = min(distToEdgeX, distToEdgeY); // ضخامت لبه شیشه‌ای float borderThickness = 0.1; // نرم کردن ماسک (از 0 تا 1) float borderMask = 1.0 - smoothstep(borderThickness - 0.09, borderThickness, distToEdge); // اگر کاملاً در مرکز هستیم، فقط تکسچر را نشان بده if (borderMask <= 0.01) { fragColor = texture(uTexture, uv); return; } // 3. اعوجاج (Distortion) در لبه‌ها vec2 distortionDir = vec2(0.5) - localUV; // اعمال اعوجاج فقط در محدوده ماسک vec2 distortedUV = uv + (distortionDir * uDistortionStrength * 0.01 * borderMask); // 4. بلور (Blur) و تجزیه رنگ (Dispersion) vec4 finalColor = vec4(0.0); if (uBlurIntensity > 0.0) { // --- تغییر اصلی: افزایش ضریب برای منشور بیشتر --- // مقدار قبلی 0.008 بود، به 0.035 افزایش یافت تا رنگ‌ها بیشتر پخش شوند float dispersion = uDispersion * 0.010 * borderMask; // نمونه‌برداری با فاصله بیشتر برای کانال‌های رنگی vec4 colR = texture(uTexture, distortedUV + vec2(dispersion, 0.0)); vec4 colG = texture(uTexture, distortedUV); vec4 colB = texture(uTexture, distortedUV - vec2(dispersion, 0.0)); vec4 baseColor = vec4(colR.r, colG.g, colB.b, 1.0); // بلور گاوسی ساده شده float blurStep = uBlurIntensity * 0.001 * borderMask; vec4 blurCol = ( texture(uTexture, distortedUV + vec2(blurStep, blurStep)) + texture(uTexture, distortedUV + vec2(-blurStep, -blurStep)) + texture(uTexture, distortedUV + vec2(blurStep, -blurStep)) + texture(uTexture, distortedUV + vec2(-blurStep, blurStep)) ) * 0.25; // اصلاح: ضریب 0.02 خیلی تیره بود، 0.25 میانگین دقیق‌تری است // ترکیب رنگ اصلی با بلور // کاهش شدت میکس بلور (از 0.7 به 0.5) تا رنگ‌های منشور شفاف‌تر دیده شوند finalColor = mix(baseColor, blurCol, 0.5); } else { finalColor = texture(uTexture, distortedUV); } // 5. میکس نهایی (مرکز شفاف + لبه‌های شیشه‌ای) vec4 clearCenter = texture(uTexture, uv); fragColor = mix(clearCenter, finalColor, borderMask); // هایلایت سفید لبه float shine = smoothstep(0.0, borderThickness * 0.5, distToEdge) * (1.0 - smoothstep(borderThickness * 0.5, borderThickness, distToEdge)); fragColor += vec4(shine * 0.15 * borderMask); }