Perché le ventole triangolari non sono supportate in Direct3D 10 o versioni successive?


16

Come descritto nella documentazione, i fan del triangolo non sono supportati in Direct3D 10 o versioni successive .

Perché? Ci sono degli inconvenienti intrinseci nel lavorare con i fan dei triangoli?


5
La mia comprensione è che, poiché i fan dei triangoli spesso si traducono in triangoli lunghi molto magri che si traducono in interops causando artefatti. Inoltre penso che richieda chiamate di disegno separate per eseguire il rendering di tutti i tentativi che non sono collegati a un fan. Dove è possibile con una striscia. Non penso che ci sia qualcosa che i fan possano fare che le strisce non possano fare di meglio.
ClassicThunder

3
I fan possono essere collegati utilizzando gli indici, quindi non sono necessarie chiamate separate. Lo stesso vale anche per le strisce (e puoi persino collegare i fan con le strisce) che è molto più flessibile, non richiede tris degenerato e più leggero in termini di larghezza di banda.
Maximus Minimus,

Risposte:


15

Da oltre un decennio i fornitori di hardware spingono strisce di triangoli, elenchi di triangoli indicizzati e strisce di triangoli indicizzati come i tipi primitivi più veloci da usare. Perché? Le strisce hanno una migliore localizzazione della cache (riutilizzando gli ultimi 2 verts inviati invece di tornare continuamente al primo) e l'indicizzazione consente alle cache dei vertici hardware di funzionare effettivamente, oltre ad essere più efficace per eliminare i verte duplicati.

Se tutti i fornitori di hardware dicono "fallo in questo modo e sarai più veloce", allora ci sono buone possibilità che se lo fai in questo modo, in realtà sarai più veloce.

Quindi D3D10 + lo formalizza; se questo è il percorso veloce, questo è il percorso che intendi utilizzare e non esistono altri percorsi. Questo è in linea con una delle filosofie progettuali di D3D10 +, che è quella di metterti sulla strada veloce e tenerti lì.


4

Non so quanto ciò influisca effettivamente sullo sviluppo, ma come con qualsiasi modifica di questo tipo, è stato detto che consentiranno agli sviluppatori di driver di scrivere driver migliori. La complessità dei driver GPU è sorprendente ma non sono sicuro che questo esatto cambiamento possa aiutare molto.

In entrambi i casi, è possibile sostituire le ventole triangolari per la maggior parte delle esigenze (come il rendering poligonale convesso) con strisce, spesso con risultati migliori.

// 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 ] );
}

EDIT: hai dimenticato di menzionare - se hai bisogno di cambiare l'ordine di avvolgimento - basta invertire il test in quel "if" (== a! =).


3

(Questa particolare domanda merita una risposta di opinione :)

Soggettivamente, direi la sua architettura astronautica. OpenGLES ha anche lanciato un sacco di cose per renderlo "meno complesso", mentre in realtà ha semplicemente spinto la complessità su ogni sviluppatore con codice legacy.

Naturalmente, anche quando l'hardware non lo supporta in modo nativo, sarebbe stato banale fornire compatibilità con le persone che sequenziano i fan dei triangoli convertendoli in strisce o triangoli.

I runtime WebGL e simili devono tenere traccia dei buffer convalidati e così via per tutto il tempo, e i driver possono facilmente gestire le persone che inviano loro fan nonostante non lo supportino.

Quindi l'intero lancio di FFP e simili è solo un grande fastidio IMO.


10 o più anni fa questa sarebbe stata una buona risposta. Oggi, la pipeline di vertici è quasi sempre implementata nell'hardware e è più probabile che i dati dei vertici siano archiviati in oggetti buffer nella memoria GPU, quindi un'ipotetica implementazione fan-to-strip in un driver richiederebbe il ripristino dei dati di vertice nella memoria della CPU per riordinare, quindi ricaricarlo nella memoria della GPU. Ciò non solo rovina l'intero punto di utilizzo degli oggetti buffer (poiché non si hanno più dati di vertici statici) ma richiede una lettura dalla memoria della GPU, quindi ciao bancarelle di pipeline e basse prestazioni.
Maximus Minimus,

1
@ mh01 quale hardware non supporta la ventola in modo nativo? L'HW deve lavorare con l'intero OpenGL dopo tutto ...
Will

I dati del vertice potrebbero essere memorizzati nella memoria della GPU, ma in un primo momento devono arrivarci dalla memoria di sistema (almeno una volta). È attraverso l'autista. (Supponendo che i dati abbiano avuto origine dal lato CPU, che, tranne per le demo hardware specializzate, lo fa quasi sempre).
BrainSlugs83,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.