didvan-app/lib/shaders/liquid_glass_lens.frag

82 lines
3.5 KiB
GLSL

#include <flutter/runtime_effect.glsl>
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);
}