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. glGetUniformLocation
Gölgelendiricinizi yükledikten sonra, bilinen adların (gibi ModelViewMatrix
veya 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_VIEW
için bir SetUniform
sarı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 .