# SwiftUI Metal Shaders: GPU ile Gorsel Efektler
iOS 17 ile SwiftUI, Metal shader'lari dogrudan view modifier olarak kullanma imkani sundu. Bu, GPU'nun muazzam paralel islem gucunu SwiftUI arayuzlerinizde kullanabileceginiz anlamina geliyor. Renkli efektler, dalga animasyonlari, pixelation, glitch efektleri ve cok daha fazlasi artik birkac satirlik Swift ve Metal kodu ile mumkun.
Onkosul: Metal Shading Language (MSL) temelleri faydali olsa da, bu rehberdeki ornekleri takip etmek icin derin Metal bilgisine gerek yoktur.
Icindekiler
- Metal Shader Nedir?
- SwiftUI Shader API
- colorEffect ile Renk Efektleri
- distortionEffect ile Bozulma
- layerEffect ile Katman Efektleri
- Custom Shader Yazimi
- Animasyonlu Shaderlar
- Performans Optimizasyonu
- Gercek Dunya Ornekleri
- Sonuc ve Oneriler
1. Metal Shader Nedir?
Metal, Apple'in dusuk seviyeli GPU programlama framework'udur. Shader ise GPU uzerinde calisan kucuk programlardir. Her piksel icin ayri ayri calistirilirlar ve bu sayede milyonlarca piksel ayni anda islenir.
Shader Turleri Karsilastirmasi
Shader Turu | SwiftUI Modifier | Girdi | Cikti | Kullanim |
|---|---|---|---|---|
**Color Effect** | `.colorEffect()` | Renk, pozisyon | Yeni renk | Renk donusumleri |
**Distortion Effect** | `.distortionEffect()` | Pozisyon | Yeni pozisyon | Dalga, bozulma |
**Layer Effect** | `.layerEffect()` | Tum katman | Piksel rengi | Blur, glow |
SwiftUI + Metal Avantajlari
- 60/120 FPS: animasyonlar (GPU-powered)
- Deklaratif: API - UIKit bridge gereksiz
- Animatable: - SwiftUI animasyon sistemi ile uyumlu
- Combine: edilebilir - birden fazla efekt ust uste
2. SwiftUI Shader API
iOS 17'de gelen ShaderLibrary sistemi, .metal dosyalarinizi otomatik olarak bulur ve Swift'ten erisim saglar.
swift
1import SwiftUI2 3// Temel kullanim - ShaderLibrary otomatik .metal dosyalarini bulur4struct ShaderDemoView: View {5 @State private var startDate = Date()6 7 var body: some View {8 TimelineView(.animation) { timeline in9 let elapsedTime = timeline.date.timeIntervalSince(startDate)10 11 Image("landscape")12 .resizable()13 .aspectRatio(contentMode: .fit)14 // Color effect shader uygula15 .colorEffect(16 ShaderLibrary.hueRotation(17 .float(elapsedTime)18 )19 )20 }21 }22}Shader Fonksiyon Imzalari
Metal shader fonksiyonlari belirli imzalara uymalidir:
swift
1// Color Effect icin:2[[ stitchable ]] half4 colorShader(float2 position, half4 color, ...args)3 4// Distortion Effect icin:5[[ stitchable ]] float2 distortionShader(float2 position, ...args)6 7// Layer Effect icin:8[[ stitchable ]] half4 layerShader(float2 position, SwiftUI::Layer layer, ...args)3. colorEffect ile Renk Efektleri
Color effect shader'lari her pikselin rengini degistirir. En basit ve en yaygin kullanilan shader turudur.
Metal Shader Dosyasi (Shaders.metal)
swift
1// Shaders.metal dosyasi2#include <metal_stdlib>3#include <SwiftUI/SwiftUI_Metal.h>4using namespace metal;5 6// Hue rotation - renk tekeri donusumu7[[ stitchable ]] half4 hueRotation(8 float2 position,9 half4 color,10 float angle11) {12 float cosA = cos(angle);13 float sinA = sin(angle);14 15 float3x3 hueMatrix = float3x3(16 float3(0.213 + cosA * 0.787 - sinA * 0.213,17 0.213 - cosA * 0.213 + sinA * 0.143,18 0.213 - cosA * 0.213 - sinA * 0.787),19 float3(0.715 - cosA * 0.715 - sinA * 0.715,20 0.715 + cosA * 0.285 + sinA * 0.140,21 0.715 - cosA * 0.715 + sinA * 0.715),22 float3(0.072 - cosA * 0.072 + sinA * 0.928,23 0.072 - cosA * 0.072 - sinA * 0.283,24 0.072 + cosA * 0.928 + sinA * 0.072)25 );26 27 half3 rotated = half3(hueMatrix * float3(color.rgb));28 return half4(rotated, color.a);29}30 31// Pixelation efekti32[[ stitchable ]] half4 pixelate(33 float2 position,34 half4 color,35 float size36) {37 float2 pixelated = floor(position / size) * size;38 // Piksel merkezini hesapla39 float2 center = pixelated + size * 0.5;40 // Mesafe bazli yumusatma41 float dist = distance(position, center) / size;42 return color * (1.0 - dist * 0.3);43}44 45// Grayscale donusumu46[[ stitchable ]] half4 grayscale(47 float2 position,48 half4 color,49 float intensity50) {51 half gray = dot(color.rgb, half3(0.299, 0.587, 0.114));52 half3 result = mix(color.rgb, half3(gray), half(intensity));53 return half4(result, color.a);54}SwiftUI'da Kullanim
swift
1struct ColorEffectsGallery: View {2 @State private var pixelSize: Float = 1.03 @State private var grayIntensity: Float = 0.04 5 var body: some View {6 VStack(spacing: 20) {7 // Pixelation8 Image("photo")9 .resizable()10 .aspectRatio(contentMode: .fit)11 .colorEffect(12 ShaderLibrary.pixelate(.float(pixelSize))13 )14 15 Slider(value: Binding(16 get: { Double(pixelSize) },17 set: { pixelSize = Float($0) }18 ), in: 1...20)19 20 // Grayscale21 Image("photo")22 .resizable()23 .aspectRatio(contentMode: .fit)24 .colorEffect(25 ShaderLibrary.grayscale(.float(grayIntensity))26 )27 28 Slider(value: Binding(29 get: { Double(grayIntensity) },30 set: { grayIntensity = Float($0) }31 ), in: 0...1)32 }33 .padding()34 }35}Easter Egg
Gizli bir bilgi buldun!
Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?
4. distortionEffect ile Bozulma
Distortion effect, piksellerin pozisyonunu degistirir. Dalga, ripple, fisheye gibi efektler bu yontemle yapilir.
Metal Shader
swift
1// Wave distortion - dalga efekti2[[ stitchable ]] float2 wave(3 float2 position,4 float time,5 float amplitude,6 float frequency7) {8 float2 result = position;9 result.y += sin(position.x * frequency + time) * amplitude;10 result.x += cos(position.y * frequency + time) * amplitude * 0.5;11 return result;12}13 14// Ripple efekti - su damlasi15[[ stitchable ]] float2 ripple(16 float2 position,17 float2 center,18 float time,19 float amplitude20) {21 float dist = distance(position, center);22 float wave = sin(dist * 0.1 - time * 5.0) * amplitude;23 float decay = max(0.0, 1.0 - dist * 0.005);24 25 float2 direction = normalize(position - center);26 return position + direction * wave * decay;27}SwiftUI'da Animasyonlu Dalga
swift
1struct WaveEffectView: View {2 @State private var startDate = Date()3 4 var body: some View {5 TimelineView(.animation) { timeline in6 let time = Float(timeline.date.timeIntervalSince(startDate))7 8 Text("Dalga Efekti")9 .font(.system(size: 60, weight: .bold))10 .foregroundStyle(.blue.gradient)11 .distortionEffect(12 ShaderLibrary.wave(13 .float(time),14 .float(5), // amplitude15 .float(0.05) // frequency16 ),17 maxSampleOffset: CGSize(width: 10, height: 10)18 )19 }20 }21}5. layerEffect ile Katman Efektleri
Layer effect en guclu shader turudur. Komsuluk piksellere erisebilirsiniz, bu da blur, glow, outline gibi efektleri mumkun kilar.
Metal Shader
swift
1// Gaussian blur2[[ stitchable ]] half4 gaussianBlur(3 float2 position,4 SwiftUI::Layer layer,5 float radius6) {7 half4 color = half4(0);8 float total = 0;9 10 for (float x = -radius; x <= radius; x += 1.0) {11 for (float y = -radius; y <= radius; y += 1.0) {12 float weight = exp(-(x*x + y*y) / (2.0 * radius * radius));13 color += layer.sample(position + float2(x, y)) * half(weight);14 total += weight;15 }16 }17 18 return color / half(total);19}6. Custom Shader Yazimi
Kendi shader'inizi yazmak icin Xcode'da .metal dosyasi olusturun ve [[ stitchable ]] attribute'u ile fonksiyonunuzu tanimlayin.
Shader Parametre Turleri
Swift Tipi | Metal Tipi | ShaderLibrary Kullanim |
|---|---|---|
Float | float | .float(value) |
CGPoint | float2 | .float2(x, y) |
Color | half4 | .color(swiftUIColor) |
CGSize | float2 | .float2(w, h) |
Image | texture2d | .image(uiImage) |
Data | buffer | .data(data) |
7. Animasyonlu Shaderlar
TimelineView ile shader parametrelerini her frame'de guncelleyerek animasyon olusturabilirsiniz.
swift
1struct AnimatedShaderView: View {2 @State private var startDate = Date()3 @State private var touchPoint: CGPoint = .zero4 5 var body: some View {6 TimelineView(.animation) { timeline in7 let time = Float(timeline.date.timeIntervalSince(startDate))8 9 RoundedRectangle(cornerRadius: 20)10 .fill(.blue.gradient)11 .frame(height: 200)12 .distortionEffect(13 ShaderLibrary.ripple(14 .float2(Float(touchPoint.x), Float(touchPoint.y)),15 .float(time),16 .float(10)17 ),18 maxSampleOffset: CGSize(width: 20, height: 20)19 )20 .gesture(21 DragGesture(minimumDistance: 0)22 .onChanged { value in23 touchPoint = value.location24 }25 )26 }27 }28}8. Performans Optimizasyonu
GPU vs CPU Karsilastirmasi
Islem | CPU (ms) | GPU/Shader (ms) | Hizlanma |
|---|---|---|---|
Blur (1080p) | 45 | 2 | 22x |
Color transform | 12 | 0.3 | 40x |
Distortion | 30 | 1 | 30x |
Pixelation | 8 | 0.2 | 40x |
Optimizasyon Ipuclari
- Shader'larda branch (if/else) minimize edin - GPU dallanmayi sevmez
- Trigonometrik fonksiyonlar pahali - lookup table kullanin
- Layer effect'te sample sayisini sinirlayin - O(n*n) karmasiklik
maxSampleOffsetdegerini minimum tutun- Gereksiz precision kullanmayin:
half(16-bit) genelde yeterli,float(32-bit) sadece gerektiginde
9. Gercek Dunya Ornekleri
- Foto duzenleme: Renk filtreleri, vintage efektler, vignette
- Oyun UI: Enerji kalkan efekti, hasar gostergesi, portal animasyonu
- E-ticaret: Urun tanimayan blur (premium preview), glow efekti
- Sosyal medya: Hikaye filtreleri, AR-benzeri overlay'ler
- Muzik uygulamasi: Ses dalgasi gorsellestirme, equalizer animasyonu
10. Sonuc ve Oneriler
SwiftUI Metal Shader'lar, uygulamaniza profesyonel gorsel efektler katmanin en performansli yoludur. iOS 17+ hedefliyorsaniz mutlaka deneyin.
Checklist
- Xcode'da .metal dosyasi olusturun
- `[[ stitchable ]]` attribute'u eklemeyi unutmayin
- `SwiftUI/SwiftUI_Metal.h` header'ini include edin
- Shader parametrelerini dogru tipte gecin
- TimelineView ile animasyon ekleyin
- maxSampleOffset'u distortion icin ayarlayin
- Gercek cihazda performans testi yapin (Simulator GPU farkli!)
ALTIN İPUCU
Bu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Okuyucu Ödülü
Tebrikler! Bu yazıyı sonuna kadar okuduğun için sana özel bir hediyem var:

