Warum werden Dreiecklüfter in Direct3D 10 oder höher nicht unterstützt?

16

Wie in der Dokumentation beschrieben, werden Dreiecklüfter in Direct3D 10 oder höher nicht unterstützt .

Warum? Gibt es Nachteile bei der Arbeit mit Dreieckslüftern?

Micah Bolen
quelle
5
Mein Verständnis ist, dass Dreiecksfächer oft sehr dünne lange Dreiecke ergeben, die zu Interops führen, die Artefakte verursachen. Ich denke auch, dass separate Draw-Aufrufe erforderlich sind, um alle Versuche zu rendern, die nicht mit einem Fan verbunden sind. Wo es mit einem Strip möglich ist. Ich denke nicht, dass es irgendetwas gibt, was Fans tun können, was Strips nicht besser machen können.
ClassicThunder
3
Lüfter können mithilfe von Indizes verbunden werden, sodass keine separaten Anrufe erforderlich sind. Gleiches gilt auch für Strips (und Sie können sogar Lüfter mit Strips verbinden), die viel flexibler sind, keine entarteten Tris erfordern und eine geringere Bandbreite aufweisen.
Maximus Minimus

Antworten:

15

Seit mehr als einem Jahrzehnt verwenden Hardwarehersteller Dreiecksleisten, indizierte Dreieckslisten und indizierte Dreiecksleisten als die am schnellsten zu verwendenden primitiven Typen. Warum? Strips haben eine bessere Cachelokalität (Wiederverwendung der letzten 2 gesendeten Verts, anstatt ständig zum ersten zurückzuspringen) und die Indizierung ermöglicht, dass Hardware-Vertex-Caches tatsächlich funktionieren und doppelte Verts effektiver eliminiert werden.

Wenn alle Hardwarehersteller sagen, dass Sie es so machen und schneller werden, besteht eine gute Chance, dass Sie tatsächlich schneller werden, wenn Sie es so machen.

Also formalisiert D3D10 + dies einfach; Wenn dies der schnelle Pfad ist, ist dies der Pfad, den Sie verwenden werden, und andere Pfade existieren nicht. Dies steht im Einklang mit einer der Designphilosophien von D3D10 +, mit der Sie auf die Überholspur gebracht und dort gehalten werden.

Maximus Minimus
quelle
4

Ich weiß nicht, wie sehr sich dies auf die Entwicklung auswirkt, aber wie bei solchen Änderungen wurde gesagt, dass sie Treiberentwicklern ermöglichen werden, bessere Treiber zu schreiben. Die Komplexität der GPU-Treiber ist erstaunlich, aber ich bin nicht sicher, ob diese genaue Änderung viel hilft.

In beiden Fällen ist es möglich, Dreieckslüfter für die meisten Ihrer Anforderungen (wie das Rendern von konvexen Polygonen) durch Streifen zu ersetzen, häufig mit besseren Ergebnissen.

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

BEARBEITEN: vergessen zu erwähnen - wenn Sie Wicklungsreihenfolge ändern müssen - kehren Sie einfach den Test in diesem "wenn" (== zu! =).

Schlange5
quelle
3

(Diese spezielle Frage erfordert eine Meinungsantwort :)

Subjektiv würde ich sagen, seine Architektur Astronautik. OpenGLES hat auch eine Menge Dinge rausgeschmissen, um es weniger komplex zu machen, und gleichzeitig die Komplexität auf jeden einzelnen Entwickler mit altem Code übertragen.

Selbst wenn die Hardware dies von Haus aus nicht unterstützt, wäre es trivial gewesen, die Kompatibilität mit Leuten zu gewährleisten, die Triangel-Fans sequenzieren, indem sie sie in Streifen oder Dreiecke konvertieren.

WebGL-Laufzeiten und solche müssen die ganze Zeit über den Überblick über validierte Puffer behalten, und Treiber können problemlos Personen verwalten, die ihnen Fans senden, obwohl sie diese nicht unterstützen.

Also das ganze rauswerfen von FFP und so ist nur ein großer Ärger IMO.

Wille
quelle
Vor 10 oder mehr Jahren wäre dies eine gute Antwort gewesen. Heutzutage ist die Vertex-Pipeline fast immer in Hardware implementiert, und es ist wahrscheinlicher, dass Vertex-Daten in Pufferobjekten im GPU-Speicher gespeichert werden. Daher würde eine hypothetische Fan-to-Strip-Implementierung in einem Treiber das Zurückziehen der Vertex-Daten in den CPU-Speicher erfordern Zum Neuanordnen und erneuten Laden in den GPU-Speicher. Das zerstört nicht nur den ganzen Sinn der Verwendung von Pufferobjekten (da Sie nicht mehr über statische Scheitelpunktdaten verfügen), sondern erfordert auch ein Rücklesen aus dem GPU-Speicher.
Maximus Minimus
1
@ mh01 welche hardware unterstützt lüfter nativ nicht? Die HW muss immerhin mit der vollen OpenGL arbeiten ...
Will
Die Vertex-Daten werden möglicherweise im GPU-Speicher gespeichert , müssen jedoch zunächst (mindestens einmal) aus dem Systemspeicher abgerufen werden. Das ist durch den Fahrer. (Angenommen, die Daten stammen von der CPU-Seite, was mit Ausnahme der speziellen Hardwaredemos fast immer der Fall ist.)
BrainSlugs83