PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vertex-Shader als Sortierer und Sichtkegelberechner...


Robbson
2006-04-07, 02:36:21
Hallo!

Eine Frage hätte ich da noch: Kann ich einen Vertex Shader dazu nutzen, die Dreiecke eines statischen Vertex Buffer im Grafikspeicher von vorn nach hinten (entsprechend des aktuellen Sichtbereichs) zu sortieren? Oder können Vertex Shader keine eigenen Speicherbereiche für die Sortierung, etc. im eigenen VRam anlegen?
Wäre doch noch effizienter als ein dynamischer VB inkl. Berechnung in Software und Busbelastung.

Grüße,
Robbson.

zeckensack
2006-04-07, 03:06:16
Hallo!

Eine Frage hätte ich da noch: Kann ich einen Vertex Shader dazu nutzen, die Dreiecke eines statischen Vertex Buffer im Grafikspeicher von vorn nach hinten (entsprechend des aktuellen Sichtbereichs) zu sortieren?Nein.Oder können Vertex Shader keine eigenen Speicherbereiche für die Sortierung, etc. im eigenen VRam anlegen?Eben nicht.
Wäre doch noch effizienter als ein dynamischer VB inkl. Berechnung in Software und Busbelastung.Unsortiert rendern und die Sauce vom Z-Buffer auflösen lassen kann effizienter sein als das Zeug immerzu aufwendig zu sortieren.

Robbson
2006-04-07, 05:03:35
Hallo Zeckensack!

Nein.Eben nicht.
Großartig... und da soll noch mal einer behaupten, bei Vertex- und Pixelshadern hätte man alle Freiheiten der Welt... :|


Unsortiert rendern und die Sauce vom Z-Buffer auflösen lassen kann effizienter sein als das Zeug immerzu aufwendig zu sortieren.

Nun ja, den bzw. die statischen VB einmalig zur Graka pusten und dann immer schön von der GPU rendern zu lassen ist sicher nett und performant, aber offenbar nicht wirklich optimal. Habe ja von außerhalb keinen Einfluß auf das was und in welcher Reihenfolge gerendert wird.
Was mich natürlich zur Frage bringt: Wie intelligent wird ein statischer VB denn von der GPU behandelt (außer Z-Buffer)? Sprich, werden alle nicht im View Frustum liegenden Vertices automatisch 'rausgeworfen?

:cop: Ja und kann ich vielleicht die Indizes bspw. von 0 bis 2000 auf 2000 bis 0 umkehren, sodaß der Aufbau aus der anderen Richtung beginnt, um die Draw-Reihenfolge für den Z-buffer Check zumindest manipulieren zu können?

Grüße,
Robbson.

zeckensack
2006-04-07, 06:06:44
Nun ja, den bzw. die statischen VB einmalig zur Graka pusten und dann immer schön von der GPU rendern zu lassen ist sicher nett und performant, aber offenbar nicht wirklich optimal. Habe ja von außerhalb keinen Einfluß auf das was und in welcher Reihenfolge gerendert wird.Verrenn dich da mal nicht gleich in einen Optimierungs-Wahn. Es kommt darauf an welche Lösung nun am effizientesten ist. Immer :|
Was mich natürlich zur Frage bringt: Wie intelligent wird ein statischer VB denn von der GPU behandelt (außer Z-Buffer)?Gar nicht.Sprich, werden alle nicht im View Frustum liegenden Vertices automatisch 'rausgeworfen?Nein.

Und manchmal ist das auch nicht schlimm. Eine GPU ist halt ein Streaming-Monster. ZB: In der Zeit wo die du brauchst um deinen Index-Buffer mit 5000 Elementen "effizient" zu sortieren um eine möglichst "intelligente" Renderreihenfolge zu erreichen hätte die GPU den ganzen Kram schon dreimal "dumm" rendern können. Sowas in der Art.
Hirn siegt nicht immer gegen rohe Gewalt.

:cop: Ja und kann ich vielleicht die Indizes bspw. von 0 bis 2000 auf 2000 bis 0 umkehren, sodaß der Aufbau aus der anderen Richtung beginnt, um die Draw-Reihenfolge für den Z-buffer Check zumindest manipulieren zu können?Jein.
Du kannst unter OpenGL bei den *Pointer-Aufrufen den "stride"-Parameter negieren, und dann auf's letzte Element zeigen statt auf das erste. Das ist aber ein ziemlich schmutziger Trick IMO.

Sauberer:
Du kannst einen Index Buffer (GL_ARRAY_ELEMENT_BUFFER_ARB in OpenGL) nehmen und dann eben die Indizes umsortieren, anstatt die Verts. Das sind im schlimmsten Fall 4 Byte, und ein Vert ist doch idR deutlich größer.
Wenn du deine Indizes (noch) im Applikationsspeicher liegen hast, kannst du natürlich auch daran rumbasteln wie du möchtest.

Robbson
2006-04-07, 06:31:13
Erstmal Danke für die Infos!

Der Optimierungswahn ist bei mir noch nicht ausgebrochen. Allerdings möchte ich natürlich zum einen auch ein paar Techniken ausprobieren, um daraus einen gewissen Lerneffekt zu erzielen. Außerdem habe ich immer die Befürchtung, daß für die interessanten Spielereien (Normalmaps, Shader-Effekte, Schatten. etc.) nicht mehr genügend Ressourcen übrig bleiben... sonst kann ich ja wohl kaum die Atmosphäre von Doom3 kicken. :D
Zugegebenerweise wird die Sichtweite äußerst gering sein... voll beabsichtigt natürlich *gg und unabhängig von der Performance. Aber gerade im 3D Editor (wo man alles überblickt) bin ich optimierungsmäßig experimentierfreudig. Ein BSP wäre da schonmal ein guter Anfang... zumindest für Innenräume. Und später 'mal LOD.

Dennoch hätte ich der GPU, unabhängig von der brachialen Rohpower, einen etwas intelligenteren Umgang mit den Daten zugetraut.

Was ansonsten die Sortierung der Indices betrifft, scheint das wohl die einzigst effektive Methode zu sein. Aber auch bei statischen VBs? Die Indices liegen neben den Vertices doch auch im Speicher der Grafikkarte, oder? (unabhängig davon, ob man sich nun eine Kopie im Systemspeicher erzeugen läßt)

Na mal schauen, was d'raus wird. Brauche ja keine komplette 3D-Engine für mein Vorhaben. Aber weitreichenden Einfluß auf die Performance zu haben ist schon äußerst schmackhaft. :rolleyes:

Grüße,
Robbson.