Bununla başa çıkmak için genellikle iki yöntem vardır. Günümüzde bunlara ileri işleme ve ertelenmiş işleme denir. Bu iki konuda aşağıda tartışacağım bir varyasyon var.
İleri işleme
Etkileyen her ışık için her nesneyi bir kez oluşturun. Buna ortam ışığı da dahildir. Ek bir karışım modu ( glBlendFunc(GL_ONE, GL_ONE)
) kullanırsınız, böylece her ışığın katkıları birbirine eklenir. Farklı ışıkların katkısı katkı maddesi olduğundan, çerçeve tamponu sonunda değeri alır
Kayan noktalı bir çerçeve arabelleğine görüntü oluşturarak HDR alabilirsiniz. Daha sonra, HDR aydınlatma değerlerini görünür bir aralığa indirmek için sahnenin son geçişini yapın; bu ayrıca çiçeklenme ve diğer post-efektleri uyguladığınız yer olacaktır.
Bu teknik için ortak bir performans geliştirmesi (sahnede çok fazla nesne varsa), renk çerçevesine herhangi bir şey çizmeden tüm nesneleri oluşturduğunuz ( glColorMask
renk yazmalarını kapatmak için kullanın) bir "ön geçiş" kullanmaktır . Bu sadece derinlik tamponunu doldurur. Bu şekilde, başka bir nesnenin arkasındaki bir nesneyi oluşturursanız, GPU bu parçaları hızlı bir şekilde atlayabilir. Köşe gölgelendiricisini çalıştırması gerekir, ancak tipik olarak daha pahalı fragman gölgelendirici hesaplamalarını atlayabilir.
Bu kodlanması daha basit ve görselleştirilmesi daha kolaydır. Ve bazı donanımlarda (esas olarak mobil ve gömülü GPU'lar), alternatiften daha verimli olabilir. Ancak üst düzey donanımda, alternatif genellikle çok fazla ışık içeren sahneler için kazanır.
Ertelenmiş oluşturma
Ertelenmiş oluşturma işlemi biraz daha karmaşıktır.
Bir yüzeydeki bir nokta için ışığı hesaplamak için kullandığınız aydınlatma denklemi aşağıdaki yüzey parametrelerini kullanır:
- Yüzey konumu
- Yüzey normalleri
- Yüzey dağınık rengi
- Yüzey aynasal rengi
- Yüzey spekülerliği
- Muhtemelen diğer yüzey parametreleri (aydınlatma denkleminizin ne kadar karmaşık olduğuna bağlı olarak)
İleri işleme sırasında, bu parametreler, doğrudan tepe gölgelendiricisinden geçirilerek, dokulardan çekilerek (genellikle köşe gölgelendiricisinden geçirilen doku koordinatları aracılığıyla) veya diğer parametreler. Dağınık renk, köşe başı rengi bir doku ile birleştirerek, birden fazla dokuyu birleştirerek hesaplanabilir.
Ertelenmiş görselleştirmede, bunu açıkça ortaya koyuyoruz. İlk geçişte tüm nesneleri yaratıyoruz. Ancak renkleri oluşturmayız . Bunun yerine, yüzey parametrelerini oluşturuyoruz . Böylece ekrandaki her pikselin bir dizi yüzey parametresi vardır. Bu, ekran dışı dokulara renderleme yoluyla yapılır. Bir doku, dağınık rengi RGB'si olarak ve muhtemelen aynasal parlaklığı alfa olarak depolardı. Başka bir doku aynasal rengi depolardı. Üçte biri normali depolar. Ve bunun gibi.
Konum genellikle kaydedilmez. Bunun yerine, buraya girmek için çok karmaşık olan matematik tarafından ikinci geçişte yeniden oluşturulur. Bir yüzeydeki noktanın kamera-boşluk konumunu anlamak için girdi olarak derinlik tamponunu ve ekran-boşluk parçası konumunu kullandığımızı söylemek yeterlidir.
Şimdi, bu dokular sahnedeki her görünür piksel için tüm yüzey bilgilerini esas aldığından, tam ekran dörtlü oluşturmaya başlıyoruz. Her ışık tam ekran dörtlü render alır. Yüzey parametre dokularından örnek alıyoruz (ve konumu yeniden oluşturuyoruz), sonra sadece bu ışığın katkısını hesaplamak için kullanıyoruz. Bu (tekrar glBlendFunc(GL_ONE, GL_ONE)
) görüntüye eklenir . Işıklar bitene kadar bunu yapmaya devam ediyoruz.
HDR yine süreç sonrası bir adımdır.
Ertelenmiş oluşturma işleminin en büyük dezavantajı, kenar yumuşatmadır. Kenar yumuşatma için biraz daha fazla çalışma gerektirir.
GPU'nuzda çok fazla bellek bant genişliği varsa, en büyük artış performanstır. Gerçek geometriyi yalnızca bir kez (veya gölge eşleme yapıyorsak gölgeli ışık başına 1 + 1) oluştururuz. Biz asla bundan sonra görünmüyorsa gizli piksel veya geometri herhangi bir zaman harcamak. Tüm aydınlatma geçiş süresi gerçekte görünen şeylere harcanmaktadır.
GPU'nuzda çok fazla bellek bant genişliği yoksa, ışık geçişi gerçekten acımaya başlayabilir. Ekran pikseli başına 3-5 dokudan çekmek eğlenceli değildir.
Hafif Geçiş
Bu, ilginç ödünleşmelere sahip ertelenmiş görselleştirmedeki bir çeşitlemedir.
Ertelenmiş oluşturma işleminde olduğu gibi, yüzey parametrelerinizi bir dizi arabellek haline getirirsiniz. Ancak, kısaltılmış yüzey verileriniz var; bu kez önemsediğiniz tek yüzey verisi, derinlik tampon değeri (pozisyonun yeniden yapılandırılması için), normal ve aynasal parlaklıktır.
Sonra her ışık için sadece aydınlatma sonuçlarını hesaplarsınız. Yüzey renkleri ile çarpma yok, hiçbir şey. Tamamen yüzey renkleri olmadan sadece nokta (N, L) ve aynasal terim. Aynasal ve yaygın terimler ayrı tamponlarda tutulmalıdır. Her ışık için speküler ve dağınık terimler iki tampon içinde toplanır.
Ardından, yüzey rengiyle son kombinasyonu yapmak için toplam speküler ve dağınık aydınlatma hesaplamalarını kullanarak geometriyi yeniden oluşturursunuz, böylece genel yansıma üretilir.
Buradaki artışlar, çoklu örneklemeyi geri almanızdır (en azından ertelenenlerden daha kolay). Nesne başına oluşturmayı ileri oluşturmaya göre daha az yaparsınız. Ancak bunun ertelenmesi gereken ana şey, farklı yüzeyler için farklı aydınlatma denklemlerine sahip olmak için daha kolay bir zamandır.
Ertelenmiş oluşturma ile, tüm sahneyi ışık başına aynı gölgelendiriciyle çizersiniz. Bu yüzden her nesne aynı malzeme parametrelerini kullanmalıdır. Işık ön geçişi ile her nesneye farklı bir gölgelendirici verebilirsiniz, böylece son aydınlatma adımını kendi başına yapabilir.
Bu, ileri işleme durumu kadar özgürlük sağlamaz. Ancak, yedeklenecek doku bant genişliğiniz varsa hala daha hızlıdır.