Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
Grafik Tasarım

Shader Graph ile Gerçekçi Prosedürel Su Efekti

Paylaşan: Unity Eğitim 05 January 2026 9 dakika okuma 44 görüntülenme

Oyun ve simülasyon dünyasında gerçekçilik, oyuncu deneyimini derinden etkileyen en kritik unsurlardan biridir. Bu gerçekçiliğin önemli bir parçası da su yüzeylerinin dinamik ve inandırıcı görünmesidir. Unity geliştiricileri için Shader Graph, kod yazmadan görsel olarak karmaşık shader'lar oluşturma imkanı sunarak bu tür efektleri geliştirmeyi oldukça kolaylaştırıyor. Bu makalede, Unity'nin Shader Graph aracıyla nasıl prosedürel su ve dalga efektleri geliştirebileceğinizi adım adım inceleyeceğiz. Amacımız, sadece güzel görünen değil, aynı zamanda performansı optimize edilmiş ve tamamen kontrol edilebilir su yüzeyleri oluşturmaktır.

Prosedürel Su Efektlerinin Önemi ve Temelleri

Geleneksel yöntemlerle su efekti oluşturmak genellikle statik dokular veya önceden render edilmiş animasyonlar kullanmak anlamına gelir. Ancak bu yaklaşımlar, dinamik çevre koşullarına uyum sağlayamaz ve tekrar eden bir görüntü sunar. Prosedürel su efektleri ise, matematiksel algoritmalar ve gürültü fonksiyonları kullanarak suyu gerçek zamanlı olarak oluşturur ve animasyonunu yapar. Bu sayede, farklı hava koşullarına, rüzgar şiddetine veya derinlik seviyelerine göre değişen, benzersiz ve canlı su yüzeyleri elde edebiliriz. Bu yöntem, özellikle açık dünya oyunlarında ve büyük su kütlelerinin bulunduğu sahnelerde hem görsel kaliteyi artırır hem de bellek kullanımını optimize eder.

Prosedürel suyun temelinde, genellikle sinüs dalgaları ve Perlin gürültüsü gibi matematiksel fonksiyonlar yatar. Bu fonksiyonlar, su yüzeyinin her bir noktasının yüksekliğini, normal vektörünü ve dolayısıyla ışıkla etkileşimini dinamik olarak hesaplamak için kullanılır. Shader Graph, bu karmaşık matematiksel işlemleri görsel düğümler (nodes) aracılığıyla kolayca birleştirmemizi sağlayarak, bir programlama dili bilmeden bile etkileyici sonuçlar elde etmemize olanak tanır.

Unity Shader Graph ile Su Efekti Oluşturma Adımları

Şimdi, Shader Graph kullanarak gerçekçi bir su efekti oluşturmanın temel adımlarına geçelim. Bu adımlar, basit bir su yüzeyinden başlayarak, yansıma, kırılma ve köpük gibi gelişmiş efektleri eklemenize yardımcı olacaktır.

1. Su Yüzeyi Oluşturma ve Temel Yapı

İlk adım, üzerinde shader'ı uygulayacağımız bir su yüzeyi oluşturmaktır. Genellikle, düşük poligonlu bir ızgara (grid) mesh bu iş için idealdir. Unity'de yeni bir 3D Object > Quad veya Plane oluşturarak başlayabiliriz. Ardından, Proje penceresinde sağ tıklayarak Create > Shader > PBR Graph (veya Universal Render Pipeline kullanıyorsanız URP Lit Graph) seçeneğini kullanarak yeni bir Shader Graph dosyası oluşturun. Bu shader'ı yeni bir materyale atayın ve materyali su yüzeyinize uygulayın. Shader Graph'ı açtığınızda, PBR Master veya Lit Master düğümünü göreceksiniz. Bu, shader'ınızın nihai çıktısıdır.

2. Dinamik Dalga Hareketi Ekleme

Suyun dinamik görünmesini sağlayan en önemli kısım dalga hareketidir. Bunu elde etmek için Offset ve Time nodlarını kullanacağız. Öncelikle, UV koordinatlarını kullanarak su yüzeyinin her noktasını manipüle etmemiz gerekir. Bir Time nodunu alın ve bunu bir Multiply nodu ile hız parametresiyle çarpın. Bu değeri bir Sine veya Cosine noduna bağlayarak periyodik bir dalgalanma elde edebilirsiniz. Daha karmaşık dalgalar için, birden fazla Sine dalgasını farklı yönlerde ve frekanslarda birleştirerek veya Gradient Noise gibi gürültü fonksiyonlarını kullanarak yüzeyin normalini değiştirebilirsiniz. Bu dalgaları Vertex Position üzerinde offset olarak uygulamak, su yüzeyinin yukarı-aşağı hareket etmesini sağlar. Unutmayın, bu sadece görsel bir etki için normal vektörünü değiştirmekle kalmaz, aynı zamanda ışıklandırmanın da dalgalara göre değişmesini sağlar.

3. Normal Map ve Yüzey Detayları

Gerçekçi su efektleri için sadece yüzeyin hareket etmesi yeterli değildir; ışığın suyla nasıl etkileşime girdiğini de simüle etmeliyiz. Bunu sağlamanın en iyi yollarından biri dinamik bir Normal Map oluşturmaktır. Dalga hareketini oluşturan aynı gürültü fonksiyonlarını kullanarak (örneğin Perlin gürültüsü), bu gürültüden bir normal map hesaplayabiliriz. Bunun için gürültü değerlerinin türevlerini alarak yüzeyin eğimini bulup, bu eğimi normal vektörlerine dönüştüren nodlar kullanılır. Alternatif olarak, birden fazla Normal From Height nodunu kullanarak farklı boyutlarda dalgaların normalini birleştirebiliriz. Bu normal map'i Master düğümünün Normal girişine bağladığımızda, su yüzeyi ışıkla çok daha inandırıcı bir şekilde etkileşime girecektir. Dinamik normal map, suyun derinliğini ve dalga yoğunluğunu daha gerçekçi yansıtır.

4. Yansıma (Reflection) ve Kırılma (Refraction) Efektleri

Su, çevresindeki nesneleri yansıtır ve altındaki nesnelerin görüntüsünü kırar. Bu iki efekt, suyun gerçekçiliğini büyük ölçüde artırır. Yansıma için, genellikle bir Cube Map veya Screen Position ve Scene Color nodları kullanılır. Eğer URP veya HDRP kullanıyorsanız, Scene Color nodu ekranın mevcut görüntüsünü alarak kırılma için kullanılabilir. Screen Position nodunu kullanarak pikselin ekran koordinatlarını alıp, dalga hareketini temsil eden bir offset (kaydırma) ekleyerek kırılma efektini simüle edebilirsiniz. Bu offset, dalganın şiddetine göre ayarlanmalıdır. Grab Pass gibi teknolojilerle (dahili olarak veya URP/HDRP'de Scene Color ile), suyun altındaki dünyanın görüntüsünü alıp dalga distorsiyonu ile birlikte gösterebilirsiniz. Yansıma ve kırılma efektlerini birleştirmek için Lerp (Linear Interpolate) nodunu kullanabiliriz; burada suyun saydamlığı (Opacity) veya derinliği, bu iki efekti harmanlamak için bir faktör görevi görür.

5. Derinlik ve Renk Geçişleri

Suyun derinliğine göre renginin değişmesi, onu daha inandırıcı kılar. Sığ sular genellikle daha açık ve şeffafken, derin sular daha koyu ve mavidir. Bu efekti elde etmek için Camera Depth Texture'ı kullanırız. Screen Position nodu ile pikselin ekran koordinatlarını alıp, Scene Depth nodu ile bu pikselin kamera derinliğini okuruz. Su yüzeyinin derinliğini (View Z) kullanarak bu iki derinlik değerini karşılaştırarak suyun gerçek derinliğini hesaplayabiliriz. Bu derinlik değerini bir Lerp nodunun T girişine bağlayarak, sığ su rengi (örneğin açık mavi) ile derin su rengi (örneğin koyu mavi) arasında yumuşak bir geçiş sağlayabiliriz. Exponent veya Power nodları ile bu geçişin keskinliğini veya yumuşaklığını ayarlayabilirsiniz.

6. Köpük (Foam) Efektleri

Özellikle dalgaların kırıldığı veya suyun bir engelle (kıyı, kaya vb.) karşılaştığı yerlerde köpük oluşumu, suyun gerçekçiliğini artıran önemli bir detaydır. Köpük efektini oluşturmak için birkaç farklı yaklaşım mevcuttur. Bir yöntem, yine derinlik farklarını kullanmaktır. Su yüzeyinin kenarlarında veya sığ bölgelerde belirli bir eşiğin altındaki derinliklerde köpük dokusu göstermek için Scene Depth ve Object Position farkını kullanabilirsiniz. Diğer bir yöntem ise, dalgaların zirve noktalarında veya dalga boylarının kesiştiği yerlerde gürültü tabanlı bir maske kullanarak köpük eklemektir. Bir Texture Sample nodu ile köpük dokusunu alıp, bir Lerp nodu ve maske ile suyun ana rengi üzerine harmanlayabilirsiniz. Köpüğe dinamik bir görünüm kazandırmak için Time nodu ile köpük dokusunu kaydırabilirsiniz.

Performans ve Optimizasyon İpuçları

Gerçekçi su efektleri oluşturmak genellikle karmaşık shader'lar ve yoğun hesaplamalar gerektirir. Performansı optimize etmek, özellikle mobil veya düşük donanımlı platformlar için hayati öneme sahiptir. İşte bazı ipuçları:

  • Karmaşıklığı Yönetin: Kullanmadığınız nodları kaldırın. Mümkün olduğunca basit algoritmalar kullanın.
  • Gürültü Fonksiyonları: Perlin gürültüsü yerine daha basit ve daha hızlı olan Gradient Noise veya Simple Noise gibi gürültü fonksiyonlarını tercih edin.
  • Texture Boyutları: Normal map'ler ve köpük dokuları gibi texture'ları optimize edin. Gereksiz yere yüksek çözünürlüklü texture'lardan kaçının.
  • LOD (Level of Detail): Kameradan uzaklaştıkça su shader'ının detay seviyesini azaltan LOD sistemleri kullanın.
  • Hesaplamaları Azaltın: Aynı hesaplamaları birden fazla yerde yapmaktan kaçının. Mümkünse, bazı değerleri CPU'da hesaplayıp shader'a parametre olarak geçirin.
  • Yansıma/Kırılma Kalitesi: Yansıma ve kırılma efektleri performans açısından en maliyetli olanlardır. Bunların kalitesini (örneğin yansıma probe'unun çözünürlüğü) dikkatlice ayarlayın veya belirli mesafelerde kapatın.

Shader Graph ile prosedürel su efekti geliştirmek, Unity'nin görsel programlama gücünü kullanarak oyunlarınıza ve projelerinize hayat katmanın harika bir yoludur. Yukarıda belirtilen adımları takip ederek ve kendi yaratıcılığınızı katarak, sadece güzel görünen değil, aynı zamanda performanslı ve dinamik su yüzeyleri oluşturabilirsiniz. Unutmayın, en iyi sonuçlar genellikle deneme ve yanılma yoluyla elde edilir. Farklı nod kombinasyonlarını deneyerek ve parametrelerle oynayarak kendi benzersiz su efektlerinizi keşfedin!

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!