Parçacık sisteminde sipariş bağımsız şeffaflık


9

Bir parçacık sistemi yazıyorum ve parçacıkları ayırmadan uygun alfa harmanlamayı elde etmek için bir hile bulmak istiyorum çünkü:

  • Her parçacık tek bir kafes içinde bir nokta sprite ve şeffaf düğümleri sıralamak için sahne grafiği yeteneğini kullanamıyorum. Yine de sistem düğümü uygun şekilde sıralanmalıdır.
  • Parçacık konumu gölgelendiricide başlangıç ​​hızı, hızlanma ve zamandan hesaplanır. Sistemi sıralamak için, tüm bu hesaplamaları CPU üzerinde yapmak zorunda kalacağım, bu da kaçınmak istediğim bir şey.
  • Yüzlerce parçacığı kamera konumuna göre ayırmak ve GPU'ya yüklemek her bir çerçevenin sessiz ve ağır bir şekilde çalışmasını sağlar.

Alfa testi GLES 2.0'da yeterince hızlı görünüyor ve saydam olmayan ancak "maskeli" dokular için iyi çalışıyor. Yine de, yarı saydam parçacıklar için yeterli değildir.

bu işi nasıl halledersin?


Düzgün sıralanmaları kesinlikle ne kadar önemlidir? Gerçekten vanilya harmanı kullanarak (önemli) bir eser gördünüz mü?
ChrisE

Bir parçacık, başka bir parçacık yerine arka planla karışabilir ve daha sonra nokta-hareketli grafiğin "dikdörtgen" özü çok dikkat çekicidir. Alfa testi burada yardımcı olur, ancak alfa değeri çok düşük olduğunda ancak parçayı atmak için yeterli olmadığında eserler hala fark edilir.
Stepan Zastupov

6
Parçacıkları oluştururken engelli derinlik yazmalarını (derinlik testlerini açık bırakarak) denediniz mi? Bu yanlış siparişi daha az belirgin hale getirmelidir.
Adam

2
Bazı deneylerden sonra derinlik yazma özelliğini devre dışı bırakmanın çoğu durumda en iyi çözüm olduğunu buldum.
Stepan Zastupov

Yanıtlar:


10

İşte yapacağım şey.

Adım 1: Sıralama. Sadece yap. Bir sorun olup olmadığına bakın. Büyük olasılıkla değil.

Adım 2: Parçacıkları, sınıflandırmaya gerçekten ihtiyaç duymayacak şekilde sınırlayın, örneğin:

  • Sadece katılar (muhtemelen alfa-kapsama kenarları ile)

    • zbuffer sıralama ilgilenelim.
  • Sadece katkı bitleri

    • a + b = b + a, bu yüzden sipariş önemli değil

Adım 3: Daha fazlasına ihtiyaç duyulursa, parçacık oluşturmayı önde ve geri kalanında olması gereken bitlere bölün ve birkaç geçişte renderleme gerçekleştirin (örneğin karmaşık dumanı düzeltebilir)

Adım 4: Hala daha fazlasına ihtiyaç duyuluyorsa veya genel bir çözüme ihtiyacınız varsa, akla gelen bir şey çok kaba bir N kova sıralaması yapmak için MRT'leri kullanmak olacaktır; parçacıkları N çıkış yüzeyine dönüştürün ve ayrı bir geçişte oluşturun.

Daha ileri bir şey, özel kullanım durumunuz hakkında daha fazla bilgi gerektirir. Ama eminim ki emir bağımsızlığına gerçekten ihtiyacınız yok. Sadece yeterince rastgele yeterince parçacık kullanın ve sorun olmaz =)


6

Parçacıkları oluştururken derinlik tamponuna yazmayın. Bu, hepsinin birbirleriyle oluşturulmasına ve harmanlanmasına izin verecektir. Yine de, sahnede geometri tarafından düzgün bir şekilde kapatılabilmeleri için derinlik testi yapmalısınız.


5

Katkı harmanlama sırası kullanmak önemli değildir:

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

Bu, hareketli grafiğinizin şeffaf bir arka plana sahip olduğunu varsayar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.