Particles (Partiküller)

Bir partikül, bazı simülasyon kurallarına göre uzayda hareket eden bir noktadır. Bu noktalar genellikle her zaman kameraya dönük (billboarding) küçük 2D quad'lar olarak render edilir ve büyük kısımları şeffaf olan bir doku içerir. OpenGL oyunumuzda bir partikül, şimdiye kadar kullandığımız hareketli bir sprite'tan farksızdır. Ancak yüzlerce veya binlerce partiküllü bir araya getirdiğinizde inanılmaz efektler oluşturabilirsiniz.

Partiküller üzerinde çalışırken genellikle konumundan sürekli yeni partiküller doğuran (spawning) ve zamanla bozunan bir partikül yayıcı (particle emitter) veya partikül üreteci (particle generator) nesnesi bulunur. Böyle bir partikül yayıcı, duman benzeri dokuya sahip küçük partiküller doğurur, yayıcıdan uzaklaştıkça renklerini soluk hale getirip parlak bir görünüm verirse ateş benzeri bir efekt elde edersiniz:

Partikül ateş örneği

Tek bir partikülün çoğunlukla zamanla azalan bir yaşam (life) değişkeni vardır. Yaşamı belirli bir eşiğin (0) altına düştüğünde partiküllü öldürürüz. Partikül yayıcı, doğurduğu partikülleri yönetir ve özelliklerine göre davranışlarını değiştirir. Genel bir partikül yapısı:

Breakout'ta, her şeyi biraz daha ilginç hale getirmek için topu takip eden basit bir partikül üreteci ekleyeceğiz:

Partikül demo

Partikül üreteci, her partiküllü topun konumunda doğurur; topun hızının bir bölümüne eşit hız verir ve partiküllerin rengini ne kadar süre yaşadığına göre değiştirir.


Shader'lar

Partikülleri render etmek için farklı shader'lar kullanırız:

Vertex Shader:

Fragment Shader:

Her partikül için standart konum ve doku niteliklerini alıyoruz ve ayrıca her partikül için sonucu değiştirmek amacıyla offset ve color uniform'larını kabul ediyoruz. Vertex shader'da partikül quad'ını 10.0f ile ölçeklendirdiğimize dikkat edin.


Güncelleme Döngüsü

Önce varsayılan Particle struct'larıyla başlatılmış bir partikül listesine ihtiyacımız var:

Her karede başlangıç değerleriyle birkaç yeni partikül doğururuz. Hâlâ (hayatta olan her partikülin değerlerini güncelliyoruz:

Yeni partikülleri sürekli listeye eklersek hızla binlerce partikülle dolu bir listeyle karşılaşırız. İstediğimiz, ölen (yaşam < 0) ilk partiküllü bulup yeni bir partikül olarak güncellemek:

Son öldürülen partiküllün indeksini saklıyoruz. Bir sonraki ölü partikül büyük olasılıkla bu indeksin hemen sonrasında olacağından önce bu saklanan indeksten aramaya başlıyoruz. Son duruma ulaşılırsa partiküllerin çok uzun yaşadığı anlamına gelir.

Liste üzerinde ilk ölü partikül bulunduktan sonra, partiküllü, bir GameObject ve bir offset vektörü alan RespawnParticle çağırarak değerlerini güncelliyoruz:

Bu fonksiyon partiküllün yaşamını 1.0f'a sıfırlar, rastgele bir parlaklık (0.5'ten başlayarak) verir ve oyun nesnesinin verisine göre (hafifçe rastgele) konum ve hız atar.

Güncelleme döngüsünün ikinci kısmı tüm partikülleri yineler ve her partiküllün yaşamını delta zaman değişkeniyle azaltır. Ardından partiküllün hayatta olup olmadığını kontrol eder; hayattaysa konum ve renk niteliklerini günceller. Her partiküllün alfa bileşenini yavaşça azaltarak zamanla kayboluyor izlenimi veriyoruz.


Render Etmek

Her partikül için offset ve renk uniform değerlerini ayarlıyoruz, dokuyu bağlıyoruz ve 2D quad render ediyoruz. glBlendFunc çağrılarına dikkat edin. Partikülleri render ederken varsayılan GL_ONE_MINUS_SRC_ALPHA yerine GL_ONE (katkılı/additive) blend modu kullanıyoruz; bu, partiküllerin üst üste yığıldığında çok güzel bir parlama efekti (glow effect) oluşturmasını sağlıyor.


Oyun İçinde Kullanım

Her şeyi düzenli tutmak için tüm bu işlevselliği barındıran bir ParticleGenerator sınıfı oluşturuyoruz. Kaynak kodu: başlıkarrow-up-right, kodarrow-up-right.

Oyun kodunda bir partikül üreteci oluşturup bu dokuylaarrow-up-right başlatıyoruz:

Update fonksiyonuna partikül üreteci için güncelleme ifadesi ekliyoruz:

Her partikül, top nesnesinin özelliklerini kullanacak; her kare 2 partikül doğurulacak ve konumları topun merkezine doğru offset edilecek. Son olarak partikülleri render ediyoruz:

Partikülleri toptan önce render ettiğimize dikkat edin. Bu şekilde partiküller diğer tüm nesnelerin önünde ama topun arkasında render edilir.

Güncellenmiş oyun sınıfı kaynak kodunu buradanarrow-up-right bulabilirsiniz.

Uygulamayı derleyip çalıştırdığınızda bölümün başındakine benzer şekilde topu takip eden bir partikül izi görmelisiniz; oyuna daha modern bir görünüm kazandırıyor. Sistem, daha gelişmiş efektleri barındıracak şekilde kolaylıkla genişletilebilir.

Last updated