[gelöst] Verständnisfrage zu Fragments

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

[gelöst] Verständnisfrage zu Fragments

Beitrag von ponx »

hallo ihr Lieben,
ich kapiere den Zusammenhang zwischen Vertices, Fragments und den Pixeln auf dem Screen nicht so richtig.
Also wenn ich's richtig verstanden habe: Ein typischer Vertex-Shader transformiert & projiziert ein Vertex auf Screen-Koordinaten, als Fließkommazahlen zwischen -1 und 1 (bzw 0 und 1), richtig? (Was steht dann überhaupt in der Z-Achse? Wann ist 1 erreicht?)
Und beim Fragment-Shader kommen dann interpolierte Koordinaten-Werte von jeweils drei(?) benachbarten Vertices an. Aber auf was bezieht sich denn ein Fragment genau? Nehmen wir mal an, ich habe ein Mesh mit 1000 Vertices, das so weit von der Kamera entfernt ist, dass letztendlich alle Vertices auf einen einzigen Screen-Pixel fallen. Zwischen was wird dann interpoliert, doch nicht zwischen allen 1000 Vertices? Wie oft wird dann der Fragment-Shader angeworfen? Und von wem eigentlich? Ich verstehe da die Aufruf-Hierarchie nicht.
hoffe es kann jemand helfen, Danke euch schonmal für's Lesen!
LG, ponx
Zuletzt geändert von ponx am 22.01.2017, 16:31, insgesamt 1-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Verständnisfrage zu Fragments

Beitrag von Krishty »

ponx hat geschrieben:Nehmen wir mal an, ich habe ein Mesh mit 1000 Vertices, das so weit von der Kamera entfernt ist, dass letztendlich alle Vertices auf einen einzigen Screen-Pixel fallen. Zwischen was wird dann interpoliert, doch nicht zwischen allen 1000 Vertices? Wie oft wird dann der Fragment-Shader angeworfen? Und von wem eigentlich? Ich verstehe da die Aufruf-Hierarchie nicht.
Die Anzahl der Vertices ist egal; es geht um die Anzahl der Dreiecke. Wenn du ein Mesh mit 1000 Dreiecken hast, und das ganze Mesh fällt auf einen Pixel, dann werden halt 1000 Dreiecke rasterisiert. Für jedes Dreieck wird ein Pixel berechnet, der zwischen den drei Vertices interpoliert wurde (unwichtiges Detail: der Fragement Shader läuft vier Mal, damit Mip Levels etc. abgeschätzt werden können), also 1000 Pixel an der selben Position. Die Grafikkarte muss bei Overdraw strikt die Eingangsreihenfolge der Dreiecke beachten, also läuft 1000 Mal hintereinander
  1. Dreieck transformieren
  2. rasterisieren
  3. einen Pixel berechnen
  4. Depth Test
  5. Pixel schreiben, falls näher
Die GPU parallelisiert das (sie wird ein Dutzend Dreiecke gleichzeitig transformieren und ein paar Dutzend Pixel gleichzeitig berechnen), aber sie wird dabei das Ergebnis nicht verändern (die parallel berechneten Pixel wandern in ihrer Eingangsreihenfolge in eine Warteschlange und werden da wieder seriell abgearbeitet – noch ein Grund, warum sehr kleine Dreiecke mit Overdraw langsam sind).
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

Re: Verständnisfrage zu Fragments

Beitrag von ponx »

vielen Dank, Krishty! Also es gibt, abgesehen von der Nähe zur Kamera, keine weitere Priorisierung von Dreiecken, die auf den gleichen Pixel fallen, richtig? Also nehmen wir mal an, ein Dreieck in meinem weit entfernten Mesh nimmt nur etwa die halbe Fläche eines Pixels auf dem Screen ein, und der Pixel wird entsprechend eingefärbt. Dann bleibt der Pixel so, selbst wenn nebendran ein gleich weit entferntes Dreieck existiert, das aber flächenmäßig den kompletten Pixel eingenommen hätte. Richtig?
Und wann immer der Fragment Shader aufgerufen wird, geht es immer nur um einen ganz bestimmten Pixel auf dem Screen, richtig? Egal, ob der von einem einzelnen Dreieck herrührt, das möglicherweise alleine den halben Bildschirm ausfüllt, oder ob es vielleicht auch nur ein Dreieck von vielen war, das auf diesen Pixel gefallen ist? Und dementsprechend erzeugt der Rasterizer aus dem großen Dreieck viele Fragments, also ein eigenes für jeden belegten Pixel. Hab ich's?
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Verständnisfrage zu Fragments

Beitrag von Krishty »

So ungefähr. Noch zwei Vertiefungen der Vollständigkeit halber:

1. Der Fall "nur ein Pixel groß" hängt stark von den Rasterisierungsrichtlinien ab. Hier ist eine Erklärung, wie D3D 10 das handhabt (OpenGL kannst du sicher selber googeln): https://msdn.microsoft.com/de-de/librar ... p/cc627092
Dadurch wird konsistent geregelt
- dass Meshes, die viele Pixel auf dem Bildschirm abdecken, deren Dreiecke aber alle jeweils kleiner als ein Pixel sind, trotzdem halbwegs richtig erscheinen
- dass zwischen benachbarten Dreiecken, die eine Kante exakt teilen, keine Pixel durchflimmern
- dass das Bild halbwegs stabil bleibt, auch wenn der Betrachter auf der Tiefenachse rollt

2. Multisampling ist ein Sonderfall. Manche Fragment Shader laufen pro Sample statt pro Pixel, mit 4x AA also 4x so oft. Das hängt aber ganz stark von der API und dem Render State ab.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

Re: Verständnisfrage zu Fragments

Beitrag von ponx »

Danke dir, Kristhy! Ich seh schon viel klarer, glaub ich. Ich verstehe u.a. noch nicht, wie sich diese ganzen Zwischenstufen in der Renderpipeline auf die Daten auswirken, die ich aus dem Vertex-Shader rausschicke. Ich lese immer, dass die TEXCOORDs interpoliert werden, bevor sie im Pixelshader ankommen. Ich kann aber einfach Daten im Vertex-Shader als TEXCOORDs abspeichern, ohne befürchten zu müssen, dass da was verändert ankommt, oder doch? Ich würde da liebend gerne nen Breakpoint setzen (können), um das besser zu verstehen. Ich muss mal mit Farbwerten rumexperimentieren, um ein Gefühl dafür zu bekommen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Verständnisfrage zu Fragments

Beitrag von Krishty »

Ja, du kannst da alles mögliche reinschreiben und es wird interpoliert.

Sieh die Texturkoordinatenregister einfach als Speicher, der pro Pixel interpoliert wird. Dass im Namen "TEX" vorkommt, hat historische Gründe:

Früher gab es dedizierte Register zum Interpolieren von Position, Farbe, Normale. Das Farbregister hat allerdings alles auf den Wertebereich [0, 1] geclampt -- und ist damit für alles mit HDR nutzlos geworden. Das Normalenregister hat auf [-1, 1] geclampt und das Ergebnis ggf. noch normalisiert, falls die API den entsprechenden State gesetzt hat -- und ist deshalb auch für vieles nutzlos geworden (z.B. für Lichtvektoren und Tiefenwerte bei Deferred Shading). Also hat man angefangen, alles durch die Texturregister zu schieben, denn davon gab's ja eh immer mindestens 8 und die machen nichts außer Interpolation.

Der Name ist halt übriggeblieben.

Du kannst übrigens die Interpolation im Shader einstellen. Direct3D erlaubt es, Texturkoordinatenregister als nointerpolate oder noperspective zu deklarieren, damit die Interpolation komplett abgeschaltet wird (immer Wert von Vertex 1) oder nicht perspektivisch korrekt durchgeführt wird (spart Anweisungen, wenn man 2D rendert). Bei OpenGL geht das auch; ich weiß nur aus dem Kopf nicht, wie.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

Re: Verständnisfrage zu Fragments

Beitrag von ponx »

super Krishty, 1000 Dank! Und wenn interpoliert wird, dann immer nur zwischen den entsprechenden Werten der drei Vertices des Dreiecks, auf dem der aktuelle Pixel liegt, ja? Dann hab ich's glaub ich endlich! :)
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Verständnisfrage zu Fragments

Beitrag von Krishty »

Ja, genau.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

Re: [gelöst] Verständnisfrage zu Fragments

Beitrag von ponx »

super, Danke nochmal!
Antworten