Bu tam olarak OpenGL'nin geometri gölgelendiricisi olmadan yaptığı şey değil miydi?
Hayır değil. GS isteğe bağlı bir adımdır, varsayılan olan bir adım değildir.
OpenGL'nin bir geometri gölgelendiricisi kullanması için " ilkel montaj " olarak bilinen şeyi yapması gerekir . Üzerinden bir dizi üçgen oluşturduğunuzda GL_TRIANGLE_STRIP
, OpenGL bitişik her 3 köşeyi ayrı bir üçgene dönüştürmek için içsel şeyler yapar ve sarım sırasını uygun şekilde değiştirir.
Normal olarak, bir GS kullanılmadığında, bu işlem bir kez gerçekleştirilir. Ancak bir GS kullandığınızda, GS çalıştırılmadan önce gerçekleştirilmesi gerekir. Ancak bir GS tamamen farklı bir ilkel tip (ör. Dörtlü) verebildiğinden GS'den sonra da gerçekleştirilmelidir .
Şimdi, sistemi temelde bir hiç için fazladan bir sürü ek iş yapıyorsunuz. Sonuçta, OpenGL olamaz varsayalım sizin GS şey (yani bir karar verilemeyen bir problem var) yaptığını.
Ayrıca, bir dizi optimizasyon artık GS varlığında çalışmaz. Dizin oluşturulmuş işleme almayı düşünün.
Bir eleman dizisi arabelleğindeki her bir dizin, bir köşe gölgelendiriciden aynı çıktıları üretecektir. Bu yüzden GPU bu çıkışları sık sık bir T&L önbelleğinde önbelleğe alır . Zaten önbellekte olan bir dizin görürse, VS tekrar çalışmaz; sadece önbellekten veri alır.
Bu ne"? "Bu" ... ilkel montaj birimi . Evet, GS kullandığında iki kez akan şey. Dizin önbellekleme şeyler? Sadece GS girişleri için çalışır .
Öyleyse GS'nin çıktılarına ne olacak? Bu donanıma bağlı. Ancak bir çeşit hafıza tamponuna girmek zorunda. Ve orada sorun var: bu tampon hiç endeksli değil. Bir glDrawArrays durumu gibi.
Bu nedenle, bir dizin arabelleği gönderirseniz 0, 1, 2, 0, 2, 3
, bu işlem T ve L önbelleğinde 4 köşeye çevrilir. Ancak GS sonrası köşelerin köşeleri şimdi 6 köşeye sahiptir. GS sonrası arabellek daha fazla alan kullanır. Eğer düzgün bir şekilde post-T ve L optimizasyonlu üçgen listeleri veya şeritleri yapma sıkıntısını yaşarsanız ve sizinki gibi bir geçişli GS'yi çevirirseniz, performansınızın yarısını bu optimizasyondan kazanmış olursunuz.
İşe yaramaz değildi, ama acıtıyor.
Buna ek olarak, birçok GL 3.x sınıfı GPU'nun (aka: DX10) GS sonrası tamponları oldukça küçük olduğu gerçeğidir. Tampon ne kadar küçükse, eşzamanlı olarak aktif olabileceğiniz GS kontrolleri o kadar az olacaktır. Böylece donanımınız GS üzerinde etkili bir şekilde tıkanıyor. Çünkü Mozaik 4.x sınıf donanım büyük bir özelliktir, bu tür pek çok donanım ağır GS canlı kullanmak için yeterli tampon vardır.
Bu nedenle, bir GS kullanmak, kod vertex işlemlerinizi darboğaz yapmak için daha olasıdır. Tabii ki, köşe ve parça gölgelendiricilerinizi daha karmaşık hale getirerek her zaman bu avantajı kullanabilirsiniz, çünkü bu noktada sadece ücretsiz performans.
GS kaynaklı yavaşlamalar hakkında daha fazla bilgi için bu makaleyi okuyun .
İşte GS'lerin temel bir kuralı: GS'yi asla kullanmayın çünkü gösterimi daha hızlı hale getireceğini düşünüyorsunuz . Yapmaya çalıştığınız şeyi mümkün kılarken kullanmalısınız. Yapmaya çalıştığınız şey bir optimizasyon ise, başka bir şey kullanın.
Bunun genel istisnaları: