Gölgelendirici üniformalarını güncellemek için en iyi yöntem nedir?


11

Gölgelendiricinin matrislerini güncel tutmanın en kabul edilen yolu nedir ve neden?

Örneğin, şu anda ShaderGLSL gölgelendirici programı ve üniformaları için kolları saklayan bir sınıfım var. Kamerayı her hareket ettirdiğimde, yeni görünüm matrisini gölgelendiriciye geçirmem gerekiyor, sonra her farklı dünya nesnesi model matrisini gölgelendiriciye geçirmeliyim.

Bu gölgelendirici nesneye erişmeden hiçbir şey yapamadığım için bu beni ciddi şekilde sınırlıyor.

ShaderManagerTüm aktif gölgelendiricileri tutmaktan sorumlu tek bir sınıf oluşturmayı düşündüm . Daha sonra herhangi bir yerden erişebilirim ve bir dünya nesnesi, sadece ShaderManageristenen matrisleri bilmesi gereken gölgelendiricilerin aktif olduğunu bilmek zorunda kalmazdı , ancak bunun en iyi yol olduğundan emin değilim ve muhtemelen bazı sorunlar var bu yaklaşımı benimsemekten doğacak.


Oluşturma zamanı geldiğinde neden gölgelendiricilere veri aktarmıyorsunuz?
Nick Caplinger

Bu niyetim ama nasıl? Eğer bir nesne gölgelendirici yaratırsa, o zaman dünya nesneleri gölgelendiricinin varlığını bilmek ve onu gerekli matrisleri aktarmak anlamına gelir?
Lerp

Yanıtlar:


12

Tek tip tamponlar kullanın (yani D3D lingo'da sabit tamponlar ).

Tüm gölgelendiriciler, bu tür her bir tamponun düzeni ve bağlama noktası üzerinde hemfikir olduğu sürece güncelleme bir esinti haline gelir. Modellerin gölgelendiriciler hakkında hiçbir şey bilmesine gerek yoktur. Model sabitleme matrisini yalnızca sabit arabelleklerinde güncellemeleri gerekir ve oluşturma hattı otomatik olarak kullanır.

En azından böyle iki tamponunuz olması gerektiğini savunuyorum. Birincisi, projeksiyon matrisinizi, kamera matrisini, birleştirilmiş kamera projeksiyon matrisini, görünüm alanı bilgilerini, hayal kırıklığı ayrıntılarını ve matris terslerini depolamalıdır. Bu arabelleği sahne başına yalnızca bir kez güncellemeniz gerekir.

Daha sonra her bir modele model görünümü matrisini, normal matrisi, tersleri ve malzeme özelliklerini depolaması için başka bir tampon verin. Bu, her model için bir kez güncellenir ve farklı bir güncelleme geçişinde (uygunsa / uygunsa) yapılabilir. Materyalleri birden fazla nesne arasında paylaşma olanağınız varsa, malzeme bilgileri üçüncü bir malzemeye özgü tampona taşınabilir / taşınmalıdır.

İleri gölgelendirme kurulumunda, tüm ışıkları başka bir tampona koymak mantıklıdır ve ertelenmiş gölgelemede de ışık geçişi için ışık başına bir tampon kullanılması mantıklıdır ( geometri geçişi).

Tekdüze arabellekleri kullanmak için orta düzeyde güncel bir GL sürümüne ihtiyacınız olduğunu unutmayın (3.1 veya bir uzantı; bazı eski ama hala hizmette olan dizüstü bilgisayarlar dışında bugün yeterince yaygın) ve oldukça yeni bir sürüme ihtiyacınız var Düzgün arabellekleri gölgelendirici kodunun içinden belirli bağlama konumlarına bağlayabilme (4.2; yine de nadir ancak daha iyi olma) aksi takdirde işleri ayarlamak için CPU tarafı kodunuzda daha fazla iş yapmanız gerekir (CPU kodunuzun doğru bağlamayı bilmesi gerekir) Yine de, ciddi bir sorundan ziyade bir API kokusu). OpenGL | ES, maalesef çoğu popüler mobil platformda hala desteklenmeyen 3.0'a kadar tek tip tamponlar eklemedi.

Tamponlar bir seçenek değilse, aktif gölgelendirici için dizin konumlarını depolamak için küresel bir yere ihtiyacınız olacaktır. glGetUniformLocationGölgelendiricinizi yükledikten sonra, bilinen adların (gibi ModelViewMatrixveya benzerleri) endekslerini bulmak için kullanabilirsiniz, ardından bu indeksleri saklayın. Oluşturmanız , bağlı gölgelendiriciye bakmak, dizini bulmak ve doğru şekilde aramak MODEL_VIEWiçin bir SetUniformsarıcı işlevine geçirilen numaralandırma değerlerini eşleyebilir glUniform. Her biri düzgün bir şekilde sarılmışsa, her bir üniformayı ayrı ayrı ayarlamaya gerek duymak dışında, tamponlardan istemci kodu kullanımında özel bir büyük değişiklik değildir.

Bkz. GLSL Inteface Blokları ve Düzgün Tampon Nesneleri .


Onların yerleşik bir yol olacağını biliyordum. Teşekkürler!
Lerp

4

Bunu yapmanın en basit yolu, gölgelendiricileriniz arasında tek biçimli adları standartlaştırmak ve çizmeden hemen önce tüm verileri göndermektir. Tepegöz deli değil, ancak daha sonra her zaman daha az güncellenmiş üniformalar göndermemek için optimize edebilirsiniz.

Bunu oyunumda yapma şeklim soyut bir Materialsınıfım olması. Malzemeler oyun ve gölgelendiriciler arasında bir köprü görevi görür. Her biri Material, Shaderdokular dahil olmak üzere ayarlanabilen bir ve çeşitli özelliklere sahiptir. Bir nesne çizme zamanı geldiğinde, onun Materialsınırı vardır. BindYöntem vardır GraphicsStatematrisleri, ışıklar, vb - tüm güncel grafik durumu içeren parametre Bindondan ihtiyacı varsa kullanılarak yöntem bağlamalar shader ve dokular ve setleri tüm üniformalar GraphicsState.

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.