5 puan yazan GN⁺ 2025-09-09 | 2 yorum | WhatsApp'ta paylaş
  • Apple’ın 2025 WWDC’de tanıttığı Liquid Glass efektinin web’de CSS, SVG ve fizik tabanlı kırılma hesaplamalarıyla nasıl yeniden üretilebileceği anlatılıyor
  • Kırılma olgusunun prensipleri ile Snell yasası kullanılarak cam yüzeyin modellenmesi ve kırılma simülasyonu süreci açıklanıyor
  • SVG displacement map kullanılarak render’a uygun bir yer değiştirme vektör alanı oluşturuluyor ve bunun gerçek UI bileşenlerine uygulanabildiği gösteriliyor
  • Yalnızca Chrome’da SVG filter’ın backdrop-filter olarak kullanılması mümkün ve çeşitli UI öğelerine (büyüteç, switch, oynatıcı vb.) uygulanmasına dair örnekler sunuluyor
  • Efekt gerçek zamanlı uygulanabiliyor, ancak tarayıcılar arası sorunlar ve performans sınırlamaları var; ayrıca gelecekte açık kaynak planlarından da söz ediliyor

Giriş

Apple, 2025 Haziran’daki WWDC’de Liquid Glass efektini ilk kez tanıttı. Bu efekt, arayüz öğelerinin kavisli kırılmalı cam gibi görünmesini sağlayarak gerçek cam yüzeyine benzer bir görsel deneyim sunuyor. Bu yazı, web ortamında CSS, SVG displacement map ve fizik tabanlı kırılma hesaplamaları ile benzer bir etkinin nasıl üretilebileceğine dair uygulamalı bir yaklaşım sunuyor. Amaç kusursuz bir uygulama yapmak değil; kırılma ve yansıma parlamaları gibi temel özellikleri yeniden üreten ölçeklenebilir bir kavram kanıtı ortaya koymak. Işığın farklı malzemelerden geçerken nasıl kırıldığı en temel prensiplerden başlayarak anlatılıyor ve efekt adım adım inşa ediliyor. Sonunda verilen etkileşimli demo şu anda yalnızca Chrome’da düzgün çalışıyor.

Kırılma olgusunu anlamak

Kırılma, ışığın bir malzemeden başka bir malzemeye geçerken ilerleme yönünün değişmesi olayıdır. Bu, her malzemede ışığın hızının farklı olmasından kaynaklanır ve Snell yasası ile geliş açısı ile kırılma açısı arasındaki ilişki şu şekilde ifade edilir:

  • n1 * sin(θ1) = n2 * sin(θ2)
    • n1: ilk ortamın kırılma indisi
    • θ1: geliş açısı
    • n2: ikinci ortamın kırılma indisi
    • θ2: kırılma açısı

Etkileşimli diyagramda görülebilenler:

  • İki ortamın kırılma indisleri aynıysa ışık kırılmadan dümdüz ilerler
  • İkinci ortamın kırılma indisi daha yüksekse ışık normale doğru kırılır
  • İkinci ortamın kırılma indisi daha düşükse ışık normalden uzaklaşır; bazı durumlarda tam iç yansıma oluşabilir
  • Gelen ışık yüzeye dikse, kırılma indisinden bağımsız olarak düz ilerler

Bu projenin sınırlamaları

Karmaşıklığı sınırlamak ve algoritmayı basitleştirmek için şu koşullar kabul ediliyor:

  • Dış ortamın kırılma indisi 1 (hava)
  • İç cam malzemesi için 1.5 kullanılıyor (tipik cam)
  • Kırılma olayı yalnızca bir kez hesaba katılıyor (çıkıştaki kırılma yok sayılıyor)
  • Gelen ışık her zaman arka plan düzlemine dik kabul ediliyor
  • Tüm nesneler 2D şekiller ve yalnızca dairesel formda ele alınıyor (dikdörtgen vb. genişletilebilir ama ek hesaplama gerekir)
  • Nesne ile arka plan düzlemi arasında boşluk yok
  • Bu koşullarla Snell yasası üzerinden tüm ışınlar basitçe hesaplanabiliyor

Cam yüzey oluşturma

Liquid Glass efektini uygulayabilmek için, sanal camın kesitini (mercek veya kavisli panel) matematiksel bir fonksiyonla tanımlamak gerekiyor.

Yüzey fonksiyonu

Cam yüzeyi bir surface function ile tanımlanıyor ve bu fonksiyon kenardan düz iç bölgeye kadar olan kalınlığı ifade ediyor

  • Fonksiyonun giriş değeri 0: dış sınır, 1: bezel sonu (düz yüzeyin başlangıcı)
  • Her noktadaki kalınlığın türevi alınarak yüzeyin normal vektörü bulunuyor
const height = f(distanceFromSide);
const delta = 0.001;
const y1 = f(distanceFromSide - delta);
const y2 = f(distanceFromSide + delta);
const derivative = (y2 - y1) / (2 * delta);
const normal = { x: -derivative, y: 1 };

Başlıca yüzey fonksiyonu türleri

  • Convex Circle: y = sqrt((1 - (1 - x))^2)
    • Basit yay biçimi; içeri gidildikçe hızla düzleşir ve kırılma kenarı belirgin olur
  • Convex Squircle: y = ((1 - (1 - x))^4)^(1/4)
    • Apple’ın sık kullandığı bir form; eğri ile düz yüzey arasındaki geçiş yumuşaktır ve ölçekleme sırasında efekt daha doğal görünür
  • Concave: y = 1 - Convex(x)
    • İçbükey form; ışık nesne sınırının dışına kırıldığı için dış bölgeden örnekleme gerekir
  • Lip: y = mix(Convex(x), Concave(x), Smootherstep(x))
    • Kenarda çıkıntılı bir lip ve ortada sığ bir kıvrım içeren bileşik yapı

Yalnızca bu dört fonksiyonla bile yüzey şekline göre kırılma farklarını etkili biçimde karşılaştırmak mümkün.

Simülasyon

Her yüzey fonksiyonuna göre ışınların kırılma yolları simüle edilerek gerçek efekt farkı görselleştiriliyor.

  • Dışbükey (Convex) yapı ışık yolunu içeri toplarken, içbükey (Concave) yapı dışarı iter
  • Apple’ın Liquid Glass yaklaşımı çoğunlukla dışbükey formu tercih ediyor (Switch gibi istisnalar hariç)
  • Arka plandaki oklar, kırılma miktarını (yer değiştirmeyi) büyüklüğe göre renklendirerek gösteriyor
  • Sağ ve sol sınırda aynı uzaklıkta bulunan noktalar aynı yer değiştirmeyi verdiğinden verimli yeniden kullanım mümkün oluyor

Yer değiştirme vektör alanı oluşturma

Cam yüzeyin tamamında, her konum için ışığın yer değiştirme yönü ve büyüklüğünü gösteren bir vektör alanı oluşturuluyor

  • Dairesel formda bu hareket her zaman sınır normalinin yönünde oluyor

Yer değiştirme büyüklüğünü önceden hesaplamak

  • Yer değiştirme büyüklüğü sınırdan olan uzaklığa göre simetrik olduğundan, yarıçap bazında değerler önceden hesaplanıp bir diziye kaydediliyor
  • 2D’de yalnızca bir kez (127 ışın simülasyonu) hesap yapılıp, ardından z ekseni etrafında döndürülerek tüm alan oluşturuluyor

Vektör normalizasyonu

Vektörleri displacement map içinde kullanabilmek için normalizasyon (en fazla 1.0 ölçek) uygulanıyor

  • En büyük yer değiştirme değeri referans alınarak diğer tüm vektör büyüklükleri buna bölünüyor
const maximumDisplacement = Math.max(...displacementMagnitudes);
displacementVector_normalized = {
  angle: normalAtBorder,
  magnitude: magnitude / maximumDisplacement,
};

SVG displacement map içinde gerçek piksel cinsinden dönüşüm yapılırken, scale ile yeniden maksimum yer değiştirme değeri çarpılarak özgün büyüklük geri kazanılıyor.

SVG Displacement Map

Matematiksel kırılma hesaplarının sonucunu doğrudan tarayıcı render’ına uygulamak için SVG displacement map kullanılıyor

  • <feDisplacementMap /> içindeki her kanal (RGBA, 8 bit) yer değiştirmenin X ve Y eksenlerini temsil etmek için kullanılabiliyor
  • Her kanal 0~255 aralığında değer alıyor ve 128 nötr durumu (yer değiştirme yok) ifade ediyor
  • displacement map’in mutlaka bir görsele dönüştürülmesi gerekiyor
<svg colorInterpolationFilters="sRGB">
  <filter id={id}>
    <feImage
      href={displacementMapDataUrl}
      x={0}
      y={0}
      width={width}
      height={height}
      result="displacement_map"
    />
    <feDisplacementMap
      in="SourceGraphic"
      in2="displacement_map"
      scale={scale}
      xChannelSelector="R"
      yChannelSelector="G"
    />
  </filter>
</svg>

Scale

Red(X) ve Green(Y) kanal değerleri [−1, 1] aralığına eşleniyor

  • scale özelliğiyle piksel cinsinden maksimum yer değiştirme değeri çarpılarak gerçek render elde ediliyor
  • scale animasyonlu hale getirilerek efekt şiddeti ayarlanabiliyor

Vektör → Red/Green değeri dönüşümü

  • Yer değiştirme vektörü (açı, büyüklük), x ve y Kartezyen koordinatlarına dönüştürüldükten sonra 128 (nötr) merkez alınarak 0~255 aralığına eşleniyor
const x = Math.cos(angle) * magnitude;
const y = Math.sin(angle) * magnitude;
const result = {
  r: 128 + x * 127,
  g: 128 + y * 127,
  b: 128,
  a: 255,
};

Ortaya çıkan görsel, SVG filter displacement map olarak kullanılabiliyor.

Playground

Etkileşimli Playground içinde yüzey formu, bezel kalınlığı, cam kalınlığı, effect scale gibi değerler gerçek zamanlı değiştirilebiliyor; böylece kırılma alanı, displacement map ve nihai render’daki farklar doğrudan gözlemlenebiliyor.

Specular Highlight

Son aşamada specular highlight (cam yüzeydeki parlak kenar vurgusu) ekleniyor

  • Apple’ın uygulaması rim light (kenar ışığı) yaklaşımına dayanıyor ve parlaklığın şiddeti yüzey normali ile ışık kaynağının açısına göre değişiyor

Kırılma ve Specular Highlight’ı birleştirmek

Nihai SVG filter içinde displacement map ile specular highlight görselleri ayrı ayrı <feImage /> ile yüklenip, ardından <feBlend /> ile birleştirilerek son efekt oluşturuluyor

  • Filter parametreleri ayarlanarak farklı görsel sonuçlar elde edilebiliyor

SVG filter’ı backdrop-filter olarak kullanmak

  • Liquid Glass efektini gerçek UI bileşenlerine uygulamak için pratikte Chrome’un backdrop-filter: url(#...) desteği gerekiyor
  • backdrop-filter için görsel boyutu otomatik ölçeklenmediğinden, öğe boyutuna uygun bir displacement map hazırlanması şart
.glass-panel {
  backdrop-filter: url(#liquidGlassFilterId);
}

Gerçek UI bileşenlerine uygulama

Hesaplanan kırılma ve displacement map temel alınarak daha gerçekçi UI bileşenlerine uygulama örnekleri hazırlanıyor

  • Yalnızca Chrome, SVG filter’ı backdrop-filter olarak işleyebiliyor
  • Örnekler gerçek üretim bileşenleri değil; amaç Liquid Glass efektinin farklı UI’larda nasıl göründüğünü göstermek

Magnifying Glass

  • Her iki tarafta kırılma ve yakınlaştırma için iki ayrı displacement map kullanılıyor
  • Gölge ve ölçek ayarıyla etkileşimli bir his veriliyor
  • Sürükleyerek mercek deformasyonu yapılabiliyor ve kırılma yolu gözlemlenebiliyor
  • Yumuşak bir specular highlight ekleniyor

Searchbox

  • Standart giriş kutusu biçimine Liquid Glass efekti uygulanıyor

Switch

  • Dış kısım dışbükey, iç kısım içbükey olacak şekilde lip bezel kullanılıyor
  • Yalnızca ortadaki slider büyütülmüş/küçültülmüş durumda; kenarlar ise iç görselin kırılmasını gösteriyor

Slider

  • Convex bezel kullanılıyor; mevcut değer camın içinden doğrudan gösterilirken, iki yanda arka plan kırılması uygulanıyor

Music Player

  • Apple Music’in Liquid Glass panel stilini taklit ediyor

  • Convex bezel ve hafif specular highlight ile derinlik hissi veriliyor

  • Albüm kapağı, şarkı adı gibi bilgiler iTunes Search API kullanılarak yükleniyor

  • (Liste biçiminde şarkı adları ve albüm bilgileri sunuluyor)

Sonuç

Bu prototip, Apple’ın Liquid Glass fikrini gerçek zamanlı kırılma efekti ve basit vurgularla sadeleştirerek ifade ediyor. Pratikte yalnızca Chromium tabanlı tarayıcılarda (veya Electron’da) çalışabiliyor; diğer tarayıcılarda ise blur katmanıyla ikame edilebiliyor.
Bu deneysel bir uygulama ve şekil/boyut her değiştiğinde displacement map’in yeniden üretilmesi oldukça verimsiz (yalnızca filter scale gibi bazı parametreler animasyonlu yapılabiliyor).
İleride açık kaynak olarak yayımlanması değerlendiriliyor; ayrıca optimizasyon ve kod düzenleme konularına ilgi duyulduğu belirtiliyor.

2 yorum

 
bobross0 2025-09-16

Web’de gördüklerim arasında liquid glass’a en çok benzeyeni bu.

 
GN⁺ 2025-09-09
Hacker News görüşü
  • WebGL shader ile benzer bir şey yapma deneyimim oldu; bunun avantajı birden fazla tarayıcıda çalışması. https://real-glass.vercel.app bağlantısını paylaştım. En zor kısım, gerçek HTML öğelerinin arkasındaki kırılma efektini düzgün biçimde yeniden üretmekti.
    • Cam efektini metnin üzerine koyup hareket ettirdiğinizde oluşan ghosting/gecikmenin sebebinin ne olduğunu merak ediyorum.
    • Bence aşırı havalı; kenarlarda renklerin ayrıldığı dispersiyon efekti bile uygulanmış gibi görünüyor.
    • Görsel olarak çok iyi ama pratikte kullanmak için tepki süresi fazla yavaş; asıl gönderideki sürüm çok daha akıcı çalışıyor.
    • Etkileyici.
  • Her kaydırmada, M4-Max Macbook Pro'da bile takılma olması etkileyici. Eğer bu tür bir teknoloji tüm arayüze uygulanacaksa, performans açısından önce endişe duyuyorum. Apple'ın bunu yapabilmesinin nedeni muhtemelen aşırı düzeyde optimize etmiş olması.
    • Yazının yazarı olarak performans sorunlarını önceden düzeltmeye çalışıyordum ama biri beklediğimden önce HN'ye göndermiş. Söylenenler doğru; şu anda biraz yavaş ve ek optimizasyon gerekiyor. Sadece kırılma/deplasman haritası değil, görselleştirme gibi diğer kısımlar da henüz optimize edilmedi.
    • Chrome'da performans iyileştirmelerini hızlıca yaptığım için biraz daha iyi olmuş olabilir. Safari'de SVG render etme hâlâ yavaş. Beklenmedik şekilde paylaşılınca daha geliştirmem gereken kısımlar kaldı.
    • Bu sitede kaydırma akıcı değil. Çoğu durumda CSS GPU'dan iyi yararlanamıyor. Apple, arayüz işleme için silikon düzeyinde özel işlemler eklemiş gibi görünüyor.
    • Benim bilgisayarımda da aynı durum vardı; kenarlık efekti de düzgün görünmedi.
  • İçerik iyi ama yazının genel kurgusu ve kalitesi de harikaydı. Liquid glass kavramı tek başına pratik UX'e özellikle ek bir fayda sağlamıyor; hatta aşırı kullanılırsa UX'e zarar verebilir. Yine de taze ve keyifli bir deneyim.
  • Bunun Chrome'a özel bir demo olduğu özellikle vurgulanıyor; son interaktif demo yalnızca Chrome'da çalışıyor (SVG filter kaynaklı backdrop-filter kısıtları nedeniyle). Diğer tarayıcılarda ise yazıyı okumak ya da basit simülasyonları görmek mümkün denmiş. Buna "Tüm ailene utanç olsun!" diye mizahi bir tepki verilmiş.
    • Bu tür bir yaklaşımın kabul edilebilir olması kaçınılmaz; amaç, söz konusu özelliğin yalnızca belirli tarayıcılarda desteklendiğini göstermek.
    • Komik olan şu ki, bende sayfa Chrome'da daha yavaş ve kaydırma daha takılarak çalıştı; buna karşılık Firefox'ta efekt desteklenmemesine rağmen daha akıcıydı. Yine de yazının kendisine gerçekten hayran kaldım.
    • Benim tepkim de benzerdi ama ilginç şekilde FireFox'ta da oldukça iyi görünüyordu.
    • Referansı merak ediyorsanız, https://youtu.be/GamP4chXJ2I?t=17 bağlantısına bakabilirsiniz.
  • Liquid glass tasarım dilinin web'e uygulanacağı zaten beklenen bir şeydi. Ama metin bozulması yüzünden bir site bataryamı yiyecekse orada uzun süre kalmam. Zaten birçok kişi takılmaları belirtmiş, o yüzden ayrıca üstünde durmayacağım.
  • Harika ve emek verilmiş bir çalışma ama liquid glass, birbirine yakın öğelerin metaball gibi birleşmesi, çeşitli tinting/clear modları, kontrollerin içerikten ayrılmış bir katmanda olması gibi bütün bir tasarım dilini ifade ediyor. Bu uygulama ise tabiri caizse daha çok basit bir "glass shader"a yakın.
    • Öğeleri birleştirme işi, çok daha basit bir filtre olan "Goo" filtresiyle çözülebilir. Bu yıllardır kullanılan bir yöntem. Referans uygulama: https://codepen.io/lenymo/pen/pJzWVy
  • liquid-glass için olan JS kütüphanesini fork edip konum düzeltme yaması ekledim; sunum yaparken kullanmak eğlenceli olabilir. Kaynak kod: https://github.com/nkzw-tech/liquid-glass
    • Güzelmiş; hatta ben bunu daha çok beğendim.
  • Firefox'ta yalnızca bazı efektler çalışıyor (ama bunun karşılığında performans var!); yine de şimdiye kadar gördüklerim içinde en iyi uygulama bu. Son birkaç gündür bununla ilgili epey araştırma yaptığım için daha da etkileyici geldi. En çok hoşuma giden şey, sitenin tasarımı ve özenle hazırlanmış interaktif görselleştirmeler oldu. Bartosz Ciechanowski ve Josh Comeau'nun işleriyle aynı seviyede hissettirdi. Keşke kaynak kodu da açık olsa.
  • Tarayıcı desteği kısıtlı olsa da bunun mükemmel bir deneme olduğunu düşünüyorum. Satır içi interaktif örnekler ciddi bir ek değer katmış. Bir noktada Ciechanowski'nin yazılarını okuyormuşum gibi hissettirdi (bkz. https://ciechanow.ski/).
  • Yeni çıkan ray-traced kaydırma çubuğu ve butonların gerçekten daha işlevsel olup olmadığını ve eski metin modlu Turbo Vision ya da Windows 3 düğmelerine kıyasla üretkenliği artırıp artırmadığını merak ediyorum.