82 lines
3.5 KiB
GLSL
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);
|
|
} |