DGL
https://delphigl.com/forum/

Bessere Performance durch automatische MipMap-Generierung?
https://delphigl.com/forum/viewtopic.php?f=20&t=3067
Seite 1 von 1

Autor:  Sascha Willems [ Mi Jul 21, 2004 09:44 ]
Betreff des Beitrags:  Bessere Performance durch automatische MipMap-Generierung?

Ehrlich gesagt hab ich momentan nicht den blassesten Schimmer warum in meiner shaderintensiven Anwendung (d.h. das alles mit nem glSlang-Shader versehen ist, ausser einer Skysphere) folgendes passiert :

Szenario 1 : Ich erstelle meine MipMaps wie gewohnt über gluBuild2DMipmaps. Dann habe ich meiner Anwendung (Fenstergröße = 800x600 Pixel) ~ 26 FpS.

Szenario 2 : Gestern habe ich via GL_SGIS_generate_mipmap automatische Mipmap-Generierung für meine Texturen aktiviert (ist ja allein schon wegen der höheren Geschwindigkeit beim Erstellen der Texturen einem gluBuild2DMipmaps vorzuziehen), hab dabei allerdings nicht wirklich auf den FpS-Counter geachtet. Aber grade eben ist mir aufgefallen, dass ich bei Nutzung von GL_SGIS_generate_mipmap plötzlich ~34 Fps habe, was schon ein recht netter Geschwindigkeitssprung ist.

Wie gesagt kann ich mir nicht erklären warum ich bei Nutzung von GL_SGIS_generate_mipmap plötzlich so nen großen Geschwindigkeitsunterschied (im positiven Sinne) drinne hab, da dies doch eigentlich zur Laufzeit gar keinen Unterschied machen dürfte. Wenn ich übrigens auf die feste Funktionspipeline umschalte, gibts keinen Unterschied mehr.

Und noch kurz zur Anwendung : Die Anwendung stellt eine recht komplexe 3DS-Szene (~6000 Dreiecke) dar, inklusive einer die Szene umgebenden Skybox. Das komplette 3DS-Modell ist in Meshes unterteilt die gegen das Frustum gecullt werden, und jeder Mesh wird dabei mit nem glSlang-Shader versehen (u.a. Parallax bump, falls es interessiert); zusätzlich gibts noch Stencilschatten für die komplette Szene. Die Texturen sind übrigens alle 2^n*2^n (ist ja Voraussetzung für automatische MipMaps).
Ich habe zwar auch noch ein Objekt in der Szene, das mittels dynamisch generierter Cubemap eine Reflektion verpasst bekommt, und daher der Grund für den Geschwindigkeitssprung sein könnte (da ich auch für diese Cubemap automatisch MipMaps generieren lasse, um via LODBias verschiedene Reflektionsarten realisieren zu können), aber da man dieses in der Ansicht die beim Start der Anwendung gesetzt wird noch nicht sehen kann (und dieses somit gegen das Frustum weggecullt wird), ist dies wohl kaum der Grund für diesen Performanceschub.

Lange Rede, kurzer Sinn : Hat jemand schonmal ähnliches im Zusammenhang mit der Nutzung von glSlang UND GL_SGIS_generate_mipmap erlebt?

Autor:  Flash [ Mi Jul 21, 2004 13:32 ]
Betreff des Beitrags: 

Kann zum Problem leider nix sagen... Mich würde aber mal deine Szene interessieren. Auf meiner GraKa laufen nix Shader. Könntest du mal einen kleinen Screenshot posten, damit man mal sieht was du da so zauberst?

Autor:  Mars [ Mi Jul 21, 2004 15:07 ]
Betreff des Beitrags: 

Eine Erklärung wäre, dass der Grafikprozessor bei dieser Extension gar keine Mipmaps im Speicher ablegt (die dann später wieder zusammeninterpoliert werden müssen), sondern einen entsprechenden Filter bereits in Hardware integriert hat, der den richtigen Farbwert der richtigen Mipmapstufe zurückliefert - damit bräuchte man nur Speicherzugriffe auf die ursprüngliche Textur, und das könnte schneller sein als auf mehrere unterschiedliche Speicherbereiche zugreifen zu müssen.

Ein etwas prosaischerer Erkläriungsansatz ist, dass GL_SGIS_generate_mipmap nicht richtig funktioniert - und du in Wirklichkeit "ungemipmappte" Texturen hast, die dann auch schneller dargestellt werden können.

Autor:  Sascha Willems [ Mi Jul 21, 2004 16:35 ]
Betreff des Beitrags: 

@Flash :
Iss zwar nix was ich jetzt unbedingt vorzeigen will, aber es ist halbwegs ansehnlich, also lad ich einfach mal Screenshots (klicken für größere Ansicht) hoch :
Bild Bild Bild Bild Bild Bild
Die beiden ersten Shots zeigen die dynamisch Cubemap auf einer Kugel, Shot 3 zeigt die ganze Szene. Shot 4 ist dann ein recht langweiliges Stück Sand, mit normalem Parallax-Mapping, während Shot 5 selbiges mit Z-Correct Parallaxmapping (oder so in der Richtung) zeigt. Wie zu sehen wird hier anhand der Heightmap im Shader der Z-Wert angepasst und es sieht so aus als hätte der Sand eine wirkliche Höhe, obwohl dies der selbe Polygonhaufen wie im Shot davor ist. Der letzte Shot zeigt dann eine Wand mit Z-Correct, bei der man schön sieht das die Stencilschatten (die sonst hart sind) in die Höhen und Tiefen der Textur "eintauchen". Man beachte bitte allerdings dass dies nicht 100% korrekt aussieht, was daran liegt das die Heightmaps für die Textur (hatte leider nur ne RGB-Vorlage, aus der ich sowohl HM als auch NM basteln musste) nicht so ist wie ich sie gerne hätte.

P.S. : "Kenner" verzeihen mir bitte den viel zu hohen und unrealistischen Specularanteil auf einigen Materialien (z.b. dem Holz), aber es sieht halt doch irgendwo toll aus wenn selbst Steine und Holze glitzern ;)

@Mars :
Letzteres fällt flach, das sieht man dann ja schon rein optisch dass definitiv Mip-Maps erstellt werden, und wenn das nicht funkionieren würde, dann würde auch der LODBias nicht funktionieren, was er aber tut. Erste Erklärung könnte allerdings irgendwo stimmen. Denn bei GL_SGIS_generate_mipmap werden die MipMaps ja von der HW erstellt, und dann evtl. (ähnlich DLs) vom Treiber so abgelegt das sie für die jeweilige HW optimiert sind, wohingegen bei gluBuild2DMipMaps ja die Mips auf der CPU erstellt werden und dann quasi als "ordinäre" Texturen hochgeladen werden. Aber auf jedenfall bringt mir die Nutzung von GL_SGIS_generate_mipmap je nach Ansicht sogar nen recht heftigen Geschwindigkeitsschub; aber wie gesagt nur wenn ich Shader nutze.

Autor:  Flash [ Do Jul 22, 2004 09:44 ]
Betreff des Beitrags: 

Ich fühle mich genötigt mal Komentare zu den Bilder abzugeben :lol:

Bild 1 und 2:
Schon ne recht nette Innenarchitektur die du da gezaubert hast. Hast du irgendwas von der Scene außerhalb von 3DS Max erstellt?
Die Reflektion auf der Kugel is noch zu klar. Jedes spiegelnde Material, vorallem wenns poliertes Metall is (wie ich vermute) verschlechtert etwas die intensität des reflektierten Lichts.

Bild 3:
Nette Skybox. Nur die Übergänge musst du später noch verschleiern
Wie hast du dieses Licht gemacht?

Bild 4 und 5:
Das is ja ein meilenweiter Unterschied!!!!
Hast du den Sand mithilfe von nem Shader so in den Ritzen verteilt. Das sieht richtig gut aus!
Allerdings würd ich die "Wellen" noch etwas weiter machen, net so eng an eng.

Bild 6:
Auch hier haste, wie beim Sand, was in die Ritzen gelegt. Sieht auch gut aus. Das problem is nur die Intensität (wie du schon angedeutet hast)
Haste dafür schon ne Lösung? Eventuell musste aus den generierten Vertiefungen ne Art Highmap machen, die dann die Intensität der Schatten beeinflusst.

Insgesammt:

Eine sehr anschauliche Demonstration von dem was ich noch nicht kann aber unbedingt mal können will. Sehr respektabel.

Wie wärs noch mit nem Brunnen in der Kathedrale? Da kannste dann noch bisl mit Partikeln und Wassershader spielen. :wink:

Autor:  Sascha Willems [ Do Jul 22, 2004 10:09 ]
Betreff des Beitrags: 

Flash hat geschrieben:
Bild 1 und 2:
Schon ne recht nette Innenarchitektur die du da gezaubert hast. Hast du irgendwas von der Scene außerhalb von 3DS Max erstellt?

Nein, das ist alles im 3DS gemacht. (Ausser der Skysphere)

Flash hat geschrieben:
Die Reflektion auf der Kugel is noch zu klar. Jedes spiegelnde Material, vorallem wenns poliertes Metall is (wie ich vermute) verschlechtert etwas die intensität des reflektierten Lichts.

Das war ja auch eher als Test gedacht um zu sehen ob die Relektionen korrekt sind. Inzwischen ist auf der Kugel ein netter Shader drauf, der genau das macht was du angesprochen hast.

Flash hat geschrieben:
Bild 3:
Nette Skybox. Nur die Übergänge musst du später noch verschleiern
Wie hast du dieses Licht gemacht?

Welche Übergänge? Das ist zudem auch keine Skybox sondern eine Skysphere.

Flash hat geschrieben:
Bild 4 und 5:
Das is ja ein meilenweiter Unterschied!!!!
Hast du den Sand mithilfe von nem Shader so in den Ritzen verteilt. Das sieht richtig gut aus!
Allerdings würd ich die "Wellen" noch etwas weiter machen, net so eng an eng.

Ja, wie gesagt über Z-Correct Bump. Für jedes Material brauch ich für das Offsetbump ja sowieso ne Heightmap (und Normalmap), und daraus entnehme ich dann einen Z-Wert um den ich dann die Fragmente "verschiebe", wodurch diese Illusion ersteht. Problematisch ist wie gesagt aber die Tatsache das ich nur die RGB-Textur habe, und daraus ne Heightmap zu erstellen ist nicht immer sehr einfach und kann schonmal mehrere Anläufe benötigen, weshalb das nicht so 100%ig korrekt aussieht.

Flash hat geschrieben:
Bild 6:
Auch hier haste, wie beim Sand, was in die Ritzen gelegt. Sieht auch gut aus. Das problem is nur die Intensität (wie du schon angedeutet hast)
Haste dafür schon ne Lösung? Eventuell musste aus den generierten Vertiefungen ne Art Highmap machen, die dann die Intensität der Schatten beeinflusst.

Siehe oben. Besonders für die Textur mit den Hieroglyphen drauf ists reichlich schwierig aus der RGB-Vorlage eine brauchbare Heightmap (+Normalmap) zu erstellen.

Flash hat geschrieben:
Wie wärs noch mit nem Brunnen in der Kathedrale? Da kannste dann noch bisl mit Partikeln und Wassershader spielen. :wink:

Wasser ist geplant, aber in der Kathedrale ist da kein Platz mehr. Werde da wohl irgendwas rundherum machen; mal sehen. Ist ja schliesslich eher so ne Basis zum Rumexperimentieren und daher eher für mich gedacht. Wollte mal so ein paar von den Sachen die ich bisher einzeln gemacht hab in ner etwas größeren Demo zusammentragen.

Autor:  Flash [ Do Jul 22, 2004 10:33 ]
Betreff des Beitrags: 

Zitat:
Welche Übergänge?


Nix weltbewegendes. Der Horizont hört einfach so gestochen scharf auf. Wenn du den im Dunst verschwinden lässt, is das sicherlich besser.

Also wie gesagt: Für ne "Testbasis für mich zum rumexperimentieren" sieht das schon ziemlich lecker aus.

Der Style deiner Umgebung is auch ganz net (ich mein nich das Neoägyptisch). Liegt irgendwo zwischen Comic(ab und an ganz knuffig) und realistisch (ab und an auch ganz schroff).

Autor:  LarsMiddendorf [ Sa Jul 24, 2004 17:49 ]
Betreff des Beitrags: 

Ich habe es auch mal getestet, aber keinen nennenswerten Unterschied feststellen können. Allerdings sinkt bei mir auf der Radeon 9800 pro die Framerate nicht so extrem bei langen Shadern. So sind es teilweise bei einem Licht immer noch 200 FPS mit zusätzlichen Horizon Mapping, ohne Specular.
Mir gefällt der neoägyptische Stil nicht so besonders und mache Dinge sehen mit wenig oder ganz ohne Specular realistischer aus, finde ich. Aber es geht ja um die Technik und daran ist nichts auszusetzen. Du kannst die Demo ja bei diesem Shader Wettbewerb von ShaderTech einreichen. Da sollte eigentlich doch schon eine neue Grafikkarte mit drin sein.
Ich habe es mit den neuen Treibern noch nicht getestet, aber funktioniert gl_FragDepth eigentlich jetzt endlich?

Autor:  Sascha Willems [ Sa Jul 24, 2004 17:53 ]
Betreff des Beitrags: 

LarsMiddendorf hat geschrieben:
Mir gefällt der neoägyptische Stil nicht so besonders und mache Dinge sehen mit wenig oder ganz ohne Specular realistischer aus, finde ich. Aber es geht ja um die Technik und daran ist nichts auszusetzen.

Geschmackssache, aber ich hatte keine Lust was komplett neues zu basteln. Wenn ich mich mal durchringe, dann bastel ich mal so ne D3-mäßige Szene, das macht dann bestimmt auch was daher.

LarsMiddendorf hat geschrieben:
Ich habe es mit den neuen Treibern noch nicht getestet, aber funktioniert gl_FragDepth eigentlich jetzt endlich?

Ja, auch der Z-Correct-Shader ist in glSlang geschrieben und das Schreiben von gl_FragDepth funzt einwandfrei (denke mal darauf hast du dich bezogen). Nagt halt nur recht stark an der Performance, was aber logisch ist wenn man eigene Z-Werte schreibt.

Autor:  LarsMiddendorf [ Sa Jul 24, 2004 18:14 ]
Betreff des Beitrags: 

Soweit ich das gemessen habe ist diese Z Verschiebung der Punkt, der die meisten FPS kostet. Allerdings lohnt es sich voll und ganz, weil man dann faktisch bis auf die Silhoutte, die man ja besser eh so läßt weil die Modelle zusammenpassen müssen, Per Pixel Displacement Mapping hat. Daher denke ich daß sich "wirkliches" Displacement Mapping sowieso nie durchsetzen wird, weil es auch nicht andere Ausgaben auf dem Bildschirm erzeugen würde.
In früheren Treiber Versionen gab es seltsame Nebeneffekt, auf die ich das mal im OpenGL Forum hingewiesen hatte, so daß ich die den durch die mvp Matrix transformierten Vertex mit interpoliert habe und dann pro Pixel durch seine W Komponente dividiert habe um gl_FragCoord und gl_FragDepth zu bekommen.

Autor:  Sascha Willems [ Sa Jul 24, 2004 18:22 ]
Betreff des Beitrags: 

Ja, wenn man den Z-Wert selbst schreibt, wird ja dann jegliche hardwareseitige Z-Optimierung (mal ausgenommen Z-Kompression) wie z.B. Early-Z deaktiviert, also schlägt sich das auch recht stark in der Performance nieder. Bei mir halbiert das (je nachdem welchen Teil der Szene ich betrachte) im Normalfall die Framerate. Ausserdem sind hier korrekte Heightmaps noch um einiges kritischer, denn wenn man für ein Material eine recht unbrauchbare Heightmap hat, dann fällt das zwar beim Bumpmapping noch nicht so sehr auf, aber dadurch dass dann auch die Z-Werte inkorrekt verschoben werden kann das schonmal schlecht aussehen.

Autor:  LarsMiddendorf [ Sa Jul 24, 2004 18:32 ]
Betreff des Beitrags: 

Je nachdem wie die NormalMaps erstellt werden sind die Normalmaps einen halben Pixel gegenüber der Heightmap verschoben. Das ist dann der Fall,wenn man jeweils die Differenz zu den nächsten Pixeln bildet,vertauscht,teilweise negiert und normalisiert.
Die Heightmap die dann ja auch für das Parallax Mapping verwendet wird, sollte eher gröber sein. Dann ist sie auch aus Entfernung besser zu erkennen und dann nur die Normalmap für die feinen Details. Mit den Hyroglyphen ist das natürlich dann irgendwie schwer zu machen.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/