Seite 1 von 1

Fullscreen Quad

Verfasst: 21.04.2016, 12:41
von Zudomon
Habt ihr Erfahrungen, was am schnellsten auf Low-End und High-End Grafikkarten läuft, wenn es um das Rendern eines Fullscreen Quads geht?

Also ich sehe da ja 3 Möglichkeiten:

1. Wie gehabt, zwei Dreiecke, die ein Quad über die komplette Fläche bilden, zeichnen
2. Ein Dreieck zeichnen, welches so groß ist, dass sie die Fullscreenfläche umschließt
3. Ein Grid aus z.B. 16x16 Dreiecke

Ich habe die drei Varianten gegeneinander bisher nicht getestet und hoffe, dass mir daher jemand schon vorher was dazu sagen kann... ;)

Re: Fullscreen Quad

Verfasst: 21.04.2016, 13:30
von Schrompf
Ich habe vor Jahren mal aufgeschnappt, dass ein Grid aus Quads wegen besserer Cache-Nutzung etwas effektiver ist. Aber bei den heutigen GPU-Caches und Rasterizer-Methoden bezweifle ich irgendwie, dass das noch aktuell ist.

Falls Du es mal profilest, sag bitte Bescheid, was rauskommt :)

Re: Fullscreen Quad

Verfasst: 21.04.2016, 13:30
von Specialist
Ich habe mal vor einiger Zeit gelesen, dass ein einzelnes Dreieck am schnellsten wäre.
Ich meine mich zu erinnern, dass das in irgendeinem Siggraph-Paper drinstand.
Allerdings kann die Erkenntnis mittlerweile sicher schon wieder überholt sein.

Meinst du denn, dass der Unterscheid für deine Anwendung signifikant wäre?

Edit: Schrompf war etwas schneller und natürlich mit einer ganz anderen Antwort :D

Re: Fullscreen Quad

Verfasst: 21.04.2016, 13:44
von Zudomon
@Schrompf
Klar, mach ich, falls ich das testen sollte. Die Frage ist, wie profiled man sowas überhaupt vernünftig? Eigentlich müsste der PS dabei ja minimal sein und dann ein paar Fullscreen Quads overdrawen...

@Specialist
Significant bestimmt nicht. Aber mein Ziel ist es, StoneQuest auch auf nem Laptop von meiner Freundin lauffähig zu bekommen... da bin ich bei Low bei etwa 10-20 FPS... selbst wenn nichts gerendert wird und nur das Deferred an ist, bin ich schon auf 55 FPS begrenzt. Da schau ich dann nach jeden Schlupfloch.
Sie hat übrigens ne Intel HD Graphics 3000. Aber Serious Sam HD läuft darauf auch eigentlich recht gut, deswegen ist das schon etwas ärgerlich alles.
Wobei ich sagen würde, damals lief das bei ihr mit 2 FPS und dann noch mit Grafikfehlern ohne Ende. Also es hat sich schon gebessert! :D

Re: Fullscreen Quad

Verfasst: 21.04.2016, 14:04
von Krishty
Das wirst du profilen müssen. Vor fast zehn Jahren gab es ein Paper von XBox-Entwicklern, in dem drin stand, dass sie hunderte Konstellationen getestet haben und ein Grid aus 13×6 Quads oder so am schnellsten war. (Ich glaube, dass das jemand auf ZFX mit „also muss man einen Praktikanten einstellen, der brute force alle Quad-Größen durchtestet“ kommentiert hat; vielleicht findest du den Thread wieder.)

Da seitdem die Pixel-Shader-Kosten generell gestiegen sind, könnten aktuelle Karten die Last besser verteilen; aber so lange Specialist das Paper nicht findet, bleibt dir nur testen.

Weißt du übrigens, womit es viiiieeeel schneller ist? Compute Shaders! XOXO

Re: Fullscreen Quad

Verfasst: 22.04.2016, 09:29
von dot
Ich würde erwarten, dass auf modernen GPUs das fullscreen Triangle am effizientesten ist...

Re: Fullscreen Quad

Verfasst: 22.04.2016, 09:51
von Tiles
Schliesse mich an und tendiere zum einzelnen Tri. Weil ich die Diskussion glaube ich schon irgendwo gelesen habe. Da ging es um Optimierung für Mobiles.

Aber ich würde erwarten dass es heutzutage selbst auf den Mobiles keinen messbarer Unterschied mehr gibt, egal welche Methode nun wirklich schneller ist. Der Einspareffekt tendiert imho gegen Null. Da gibts ganz andere Baustellen wo man viel gewinnen kann ^^

Re: Fullscreen Quad

Verfasst: 22.04.2016, 10:05
von Matthias Gubisch
Nachdem die Pixel doch erst losstarten können wenn die Vertizes fertig sind.

Sollte es da nicht egal sein wieviele Vertices man hat solange Anzahl Vertices < Max Shader per Multiprocessor (ka wie das bei AMD heist) ist?

Re: Fullscreen Quad

Verfasst: 22.04.2016, 10:08
von dot
Du willst möglichst keine Edges haben die durch den Screen gehen, da die GPU Quad Shading auf 2x2 Pixel Quads betreibt und an Edges daher unnötige Arbeit verrichted wird... ;)

Re: Fullscreen Quad

Verfasst: 22.04.2016, 10:10
von Matthias Gubisch
Gutes Argument, dann sollte wohl tatsächlich das FullscreenTri das schnellste sein.

Ich merke ich sollte mich wieder mehr mit dem Thema beschäftigen ;) Da vergisst man soviel....

Re: Fullscreen Quad

Verfasst: 22.04.2016, 11:45
von Krishty
ähm … die GPU zersägt die Dreiecke doch sowieso, so dass sie nicht über die Viewport-Kanten hinausragen. Auch ein einzelnes Dreieck wird vor der Rasterisierung in zwei oder mehr Dreiecke zerlegt, wenn es eine Bildschirmkante überschreitet. Kanten laufen also so oder so durch’s Bild, ob man sie nun explizit hinschickt oder nicht.

Hier hab ich’s aufgenommen vor … acht Jahren. Fuck, bin ich eine alte Omma.
[youtube]e-VsSXN0504[/youtube]

Re: Fullscreen Quad

Verfasst: 22.04.2016, 12:21
von dot
Hm, das wundert mich tbh, ich wäre davon ausgegangen, dass Dreiecke nur zersägt werden, wenn sie die Near-Plane schneiden oder über das Guard-Band hinausragen. Wie genau hast du das denn aufgenommen? xD

Re: Fullscreen Quad

Verfasst: 22.04.2016, 12:45
von Krishty
Man hat seit D3D 10 die Möglichkeit, einzelne Samples zu laden. Also habe ich den Depth Buffer als Textur gebunden, alle Samples eines Pixel geladen, und Weiß ausgegeben, falls sie sich unterscheiden. Falls alle Samples die selbe Tiefe haben, habe ich Schwarz ausgegeben.

Man kann das gleiche erreichen, indem man gewöhnliche Texturkoordinaten mit Centroid-Texturkoordinaten vergleicht. Dann muss man aber in Sample Frequency laufen statt in Pixel Frequency.

DICE haben das AFAIR ein paar Jahre später gemacht, um Multisample-Pixel von gewöhnlichen Pixeln zu maskieren und einen gesonderten Shader drüberlaufen zu lassen (damit Postprocessing bei 4× MSAA nicht 4× so viele Pixel-Shader-Aufrufe braucht).

P.S.: Man sieht’s im Video schlecht, aber die Kanten vom Zersägen beeinträchtigen nicht ganz so viele Pixel wie normale Dreieckskanten. Wahrscheinlich war das in Hardware schon hoch optimiert.

P.P.S: Das Video dürfte damals sogar mit einer Desktop-Variante der HD3000 oder HD4000 aufgenommen worden sein; die Karte ging irgendwann kaputt und jetzt weiß ich nicht mehr, welches Modell es genau war.

Re: Fullscreen Quad

Verfasst: 22.04.2016, 16:26
von Jonathan
Irgendwie bin ich mir nicht sicher, ob die Anzahl der Dreiecke in dieser Größenordnung wirklich so einen starken Einfluss auf die Rechenleistung hat. Klar mag das eine ein wenig schneller sein, als das andere, jedenfalls auf der passenden Grafikkartengeneration (kann auf der nächsten ja wieder ganz anders sein). Aber ich habe das Gefühl, wenn es darum geht ein Spiel 2-3 mal schneller zu machen, dann ist das optimale Zeichnen eines Fullscreenquads ganz sicher nicht der Anfang der Optimierungen.

Re: Fullscreen Quad

Verfasst: 22.04.2016, 17:39
von Krishty
Jonathan hat geschrieben:Irgendwie bin ich mir nicht sicher, ob die Anzahl der Dreiecke in dieser Größenordnung wirklich so einen starken Einfluss auf die Rechenleistung hat.
Naja, es bestimmt wohl die Verteilung der Rechenleistung. Die GPU muss ja die Quads irgendwie an die Pixel Shader weiterleiten, und mit der Quad-Größe kann man das ungefähr steuern.
Klar mag das eine ein wenig schneller sein, als das andere, jedenfalls auf der passenden Grafikkartengeneration (kann auf der nächsten ja wieder ganz anders sein). Aber ich habe das Gefühl, wenn es darum geht ein Spiel 2-3 mal schneller zu machen, dann ist das optimale Zeichnen eines Fullscreenquads ganz sicher nicht der Anfang der Optimierungen.
Nein, das nicht. Aber wenn es um Low-Level-Hardware geht, nimmt man alles mit, was man kriegt.

Re: Fullscreen Quad

Verfasst: 22.04.2016, 23:02
von dot

Re: Fullscreen Quad

Verfasst: 22.04.2016, 23:31
von Krishty
Acht Prozent … nicht schlecht. Aber bevor ich sage Go for that triangle!, sage ich: Miss alle drei!

Und damit hat dir der Thread keine Antworten gebracht. Aber zumindest lernen wir alle was.

Re: Fullscreen Quad

Verfasst: 23.04.2016, 21:36
von Jörg
Noch ein Nachtritt...bei (mobilen) kachelbasiert-zeichnenden Grafiklösungen gibt es die lokale Kohärenz gratis. Da fallen die Verluste durch die Helferpixel an den (vielen) Diagonalen eher ins Gewicht.

Re: Fullscreen Quad

Verfasst: 27.04.2016, 16:39
von joeydee
Acht Prozent aber nur dann, wenn man die Hardware ausschließlich mit solchen FS-Quads/-Tris auslastet.
Ansonsten, wenn es nur ein Quad vor ausgereizter Szene ist (HUD, Postpro,...), macht das nicht viel aus. Von 0.1ms ist die Rede. Gerade am unteren HW-Ende (bzw. am oberen Ausreiz-Ende), wo Optimierungen interessant werden, ist das z.B. bei um die 40 FPS ein Unterschied in den Framezeiten von z.B. 25.1ms statt 25ms. Da schlägt jeder Kameraschwenk wahrscheinlich mehr Wellen, der Unterschied poppt vermutlich gar nicht mal auf, also in der Praxis unmessbar.
Mein persönliches Fazit: lieber in "Pro-Levelobjekt"-Optimierungen investieren, da holt man bei vollgepackter Szene generell mehr raus als bei solchen Einmal-Objekten; die sind eigentlich ziemlich egal.

Re: Fullscreen Quad

Verfasst: 06.05.2016, 12:19
von dot
Wen's interessiert: Mir kam es im Zuge meiner Arbeit zufälligerweise dran, die Sache mit dem Clipping zu testen. Fazit: Zumindest auf NVIDIA seit mindestens Fermi (getestet auf GTX 580, GTX 780 Ti, GTX 970 und GTX 980 Ti; Test basierend auf NV_shader_thread_group) wird nur gegen die Near-Plane geclipped. Ein Fullscreen Triangle auf NVIDIA produziert nur vollständig gefüllte Quads...