Üçgen fanlar neden Direct3D 10 veya sonraki sürümlerde desteklenmiyor?


16

Belgelerde ele alındığı gibi, üçgen fanlar Direct3D 10 veya sonraki sürümlerde desteklenmemektedir .

Neden? Üçgen fanlarla çalışmanın doğal dezavantajları var mı?


5
Anladığım kadarıyla, üçgen fanlar genellikle çok sıska uzun üçgenlerle sonuçlanır ve bu da birlikte çalışmalara neden olan interoplara neden olur. Ayrıca bir fan ile bağlı olmayan herhangi bir denemeyi oluşturmak için ayrı çizme çağrıları gerektirir düşünüyorum. Bir Strip ile mümkün olduğu yerde. Hayranların yapabileceği, şeritlerin daha iyi yapamayacağı bir şey olduğunu düşünmüyorum.
ClassicThunder

3
Fanlar, indeksler kullanılarak bağlanabilir, böylece ayrı çağrılar gerekmez. Aynı şey çok daha esnek olan, dejenere tris gerektirmeyen ve bant genişliği açısından daha hafif olan şeritler için de geçerlidir (ve hatta fanlı şeritlerle de bağlayabilirsiniz).
Maximus Minimus

Yanıtlar:


15

On yıldan fazla bir süredir donanım satıcıları kullanmak için en hızlı ilkel tipler olarak üçgen şeritleri, endeksli üçgen listelerini ve endeksli üçgen şeritleri itmektedir. Neden? Şeritler daha iyi önbellek konumuna sahiptir (sürekli olarak birincisine geri dönmek zorunda kalmak yerine gönderilen son 2 verts'i yeniden kullanır) ve endeksleme donanım tepe önbelleklerinin gerçekten çalışmasına ve yinelenen verileri ortadan kaldırmak için daha etkili olmasına izin verir.

Tüm donanım satıcıları "bu şekilde yapın ve daha hızlı olacaksınız" diyorsa, bu şekilde yaparsanız aslında daha hızlı olma şansınız oldukça yüksektir.

D3D10 + bunu sadece resmileştirir; hızlı yol buysa, kullanacağınız yol budur ve diğer yollar mevcut olmaz. Bu, sizi hızlı yola sokmak ve sizi orada tutmak olan D3D10 + 'nın tasarım felsefelerinden biri ile uyumludur.


4

Bunun gelişimi gerçekten ne kadar etkilediğini bilmiyorum, ancak bu tür değişikliklerde olduğu gibi, sürücü geliştiricilerinin daha iyi sürücüler yazmasına izin verdikleri söylendi. GPU sürücülerinin karmaşıklığı şaşırtıcı ama bu kesin değişikliğin çok yardımcı olup olmayacağından emin değilim.

Her iki durumda da, ihtiyaçlarınızın çoğu için (dışbükey çokgen oluşturma gibi) üçgen fanları, genellikle daha iyi sonuçlarla şeritler ile değiştirmek mümkündür.

// A simplified API interface is presented for the purposes of having readable pseudocode
// Push( pos ) - pushes position data to make a new vertex
// TRIANGLE FANS:
for( i = 0; i < vertices.count; ++i )
    Push( vertices[ i ] );

// TRIANGLE STRIPS:
for( i = 0; i < vertices.count; ++i )
{
    if( i % 2 == 0 )
        vertex = i / 2;
    else
        vertex = vertices.count - 1 - i / 2;
    Push( vertices[ vertex ] );
}

DÜZENLEME: söylemeyi unuttum - sargı sırasını değiştirmeniz gerekiyorsa - sadece testi bu "if" (== için! =) Ters.


3

(Bu özel soru görüş cevabını garanti eder :)

Öznel olarak, mimari astronotizm olduğunu söyleyebilirim. OpenGLES ayrıca 'daha az karmaşık' hale getirmek için birçok şey attı, bunun yerine karmaşıklığı eski kodla her geliştiriciye itti.

Tabii ki, donanım doğal olarak desteklemese bile, üçgen fanları sıralayan insanlarla şeritlere veya üçgenlere dönüştürerek uyumluluk sağlamak önemsiz olurdu.

WebGL çalışma süreleri ve bu türler, onaylanmış arabellekleri ve her zaman bunları takip etmek zorundadır ve sürücüler desteklememelerine rağmen hayranlarını gönderen kişileri kolayca yönetebilir.

Yani tüm FFP ve benzeri atma sadece büyük bir can sıkıcı IMO.


10 yıl veya daha önce bu iyi bir cevap olurdu. Bugün, köşe hattı hattı neredeyse her zaman donanımda uygulanır ve köşe verilerinin GPU belleğindeki tampon nesnelerde saklanması daha olasıdır, bu nedenle bir sürücüdeki varsayımsal bir fan-strip uygulamasının köşe verilerinin CPU belleğine geri çekilmesi gerekir yeniden sıralamak için GPU belleğine yeniden yükleyin. Bu sadece arabellek nesnelerini kullanmanın bütün noktasını değil (artık statik tepe noktası verileriniz olmadığından) değil, aynı zamanda GPU belleğinden bir geri okuma gerektirir, bu yüzden merhaba boru hattı durakları ve düşük performans.
Maximus Minimus

1
@ mh01 hangi donanım fanı yerel olarak desteklemiyor? HW ... sonuçta tam OpenGL ile işe sahiptir
Will

Tepe noktası verileri GPU belleğinde saklanabilir , ancak ilk etapta (en az bir kez) sistem belleğinden oraya ulaşması gerekir. Bu şoför aracılığıyla. (Özel donanım demoları dışında neredeyse her zaman olduğu gibi, veri kaynaklı CPU tarafı olduğu varsayılırsa).
BrainSlugs83
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.