Huhu, bin Neuling hier, deshalb zum Aufwärmen mal ne einfache Frage für euch
In meiner Scene Transformiere ich ein VBO via Skelett (Knochen) und Shader (Matrizen der einzelnen Knochen werden an den Shader übergeben, dort je nach Knochen-Index die Vertices transformiert). Da ich das Rendern der Scene jedoch mehrmals durchführen muss, ohne dass sich eine Transformation der Knochen abspielt (für Shadowmap-Berechnung), dachte ich ich pack das ganze in eine Display-Liste. Da ich aus dem ganzen Inhalt nun diverse Parabolide-Maps rendern muss, muss ich die Vertices in meiner Display-Liste nochmals über einen Shader transformieren...
Kann ich also die Ausgabe des Inhalts einer Display-Liste über ein vorher gebundenes Shader-Programm nochmals transformieren vor der Ausgabe, oder wird dieser Shader von der Display-Liste irgnoriert?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wenn du innerhalb der Displayliste die Shader nicht deaktivierst oder so etwas würde ich spontan sagen, dass der Shader sich ganz normal darauf auswirken muss. Denn die Displayliste ist nur eine andere Art Daten an OpenGL zu übermitteln.
Allerdings wenn du bereits mit VBOs arbeitest brauchst du normal keine Displaylisten mehr. Innerhalb der Displaylisten wird auf neueren System mit VBOs gearbeitet und wenn du die schon benutzt dann nimmt dir das nur Flexibilität, da du DisplayListen im nachhinein nicht mehr verändern kannst. Von der Geschwindigkeit her dürfte sich nichts ändern.
Hmm, nein, eben klappt das irgendwie nicht. Wenn ich vor dem Aufruf zum zeichnen der Liste einen Shader setze wird das ignoriert und es wird der Shader verwendet, welcher beim erstellen der Liste gesetzt wurde... Ja, ich arbeite mit VBOs aber die Transformation des VBOs passiert in einem Vertexshader und das ist das eigentliche Problem, da ich den transformierten Zustand irgendwie nicht "speichern" kann um diese transformierte Scene mehrmals zu rendern (renderpasses).
Also der Ablauf ist eigentlich so:
1. Neue Liste erstellen
2. Aufzeichnung starten
3. Shader setzen (macht skeletale Transformation)
4. VBO rendern (Vertices werden durch gesetzten Shader transformiert)
5. Aufzeichnung stoppen
So, und jetzt will ich das eben berechnete mehrmals wieder zeichnen, jedoch will ich auf die eben transformierte Geometrie jetzt einen anderen neuen Shader anwenden.
1. Setzen der Modelmatrix
2. Setzen des Shaders der den Listeninhalt nun nochmals speziell transformieren soll
3. Zeichnen der Liste
(dieser Vorgang 1-3 wird dann mehrmals ausgeführt mit verschiedenen Modelmatrizen)
Leider ist da nix zu machen, da sich die Liste auch gemerkt hat, welchen Shader ich beim Aufzeichnen verwendet habe und ignoriert diesen nun...
Wenn das nicht geht, vielleicht die generelle Frage:
Wie kann ich durch Vertex-Shader transformierte VBO wieder einfangen? Die Vertices werden ja erst beim rendern transformiert und dann direkt ausgegeben ich will aber diese transformation wieder z.b. in einen VBO speichern... ?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Genau das hatte ich ja geschrieben. Du setzt den Shader innerhalb der Displayliste und damit überschreibst du den aktuellen Shader.
Du kannst innerhalb des einen Shaders immer neu transformieren. Ich kenne mich mit Shader nicht so wirklich gut aus. Aber evtl. gibts auch die Möglichkeit die Daten ganz speziell in eine Textur zu rendern und diesen Speicher dann in den des VBOs zu kopieren. Zu mindest hatte ich so etwas mal einem DX Dokument gesehen. Aber damit kenne ich mich wie gesagt nicht aus.
Denn die Daten nach dem Shader gehen an den Rasterizer und da kommt man nur ran, wenn man die Bilddaten abgreift. Sonst gibts da keine wirklichen Möglichkeiten.
Aber mal. Was anderes. Was hast du denn genau vor? Evtl gibts ja einen anderen Weg an den du bisher nicht gedacht hast.
Also was ich genau vorhabe ist eigentlich einfach: Ich muss meine Scene mehrmals mit verschiedenen Modellmatrizen rendern, in meinem Fall um Dual Parabolide Maps für die Schattenberechnung zu erstellen. Also muss ich das ganze für jede aktive Lichtquelle einmal rendern. Da sich die Geometrie der ganzen Scene zwischen dem rendern für die einzelnen Lichtquellen nicht mehr verändert, möchte ich die vorgängigen Transformationen (in meinem Fall skeletale Animation) nur einmal ausführen, wegen der Geschwindigkeit.
Die Möglichkeit die du beschreibst, die erste Transformation der VBO durch eine Textur wieder zu erhalten, habe ich auch schon studiert, das wäre die letzte Variante die ich angehen würde und selbst dort müsste ich mal testen ob das wirklich schneller ist, als die Vertices jedes mal zu transformieren.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also wenn es sinnvoll möglich ist irgendwelche Berechnungen auf der GPU durchzuführen dann sollte man ihr den Vortritt gewähren, da sie speziell auf so etwas optimiert ist. Und damit um längen schneller sein wird. Auf der CPU gibt es zwar Befehle wie MMX, SSE etc. Mit denen ist es möglich mehrere Werte gleichzeitig zu berechnen. Aber ich denke nicht, dass das an die GPU herran kommen wird. Zu mal die CPU auch noch mit genügend anderen Sachen beschäftigt ist.
Und sonst habe ich damit bisher noch so gar nichts gemacht. Aber nach meinem Wissen nach gibt es wohl keine Alternative zur Textur. Aber das wird der ein oder andere sicher besser wissen als ich.
Das zwischenspeichern ist im prinzip nur mit transform feedback möglich, welches zur Zeit nur auf GF8/9 karten funktioniert. Der Geschwindigkeitsgewinn wäre in dem fall auch relativ gering. (Es ist deutlich interresanter für partikel)
Zu den displaylisten: Man kann auf sie problemlos verzichten, wenn man VBOs verwendet. Wenn man in die extension papers schaut gibt es dort jede menge situationen in denen deren verhalten vom erwartetem abweicht. Prinzipellsind sie auch als veraltet eingestufft, da sie in OGL3 entfallen werden.
Zu den paraboliden maps: Sie sind etwas eingeschränkt und tendieren zu artefakten wenn die triangles zu groß werden. In zukunft sind Cubemaps besser geeignet.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Script hat geschrieben:
Vielen Dank, ich mach mal ein neues Topic in der Shader-Gruppe nur bezogen auf die Technik mit der Textur
Ich kann das Thema auch verschieben. Was ich jetzt auch mal getan habe. Wollte erst nur abwarten ob nicht evtl noch jemand einen ganz anderen Ansatz kennt.
Das andere Thema mache ich der Übersicht halber mal zu. Aber hier der Text aus dem anderen Post.
Script hat geschrieben:
Hallo! Wie der Titel schon sagt, möchte ich gerne die Daten der im Vertex-Shader transformierten Vertices wieder auslesen und sie in ein VBO schreiben. Leider fehlt es mir an der Kenntnis einer möglichen Schnittstelle dazu, bzw. wie ich diese Daten aus dem Shader wieder rausbekomme. Die einzige Idee die da wäre ist, die Daten an den Fragmentshader weiter zu geben und dann in eine Textur zu schreiben (die z.b. an ein FBO gebunden wurde). Anschliessend könnte ich diese Vertex Daten aus der Textur wieder in ein VBO einlesen und fertig. Hat irgendjemand das schonmal gemacht oder Ideen wie der code dieser Shader aussehen müsste, damit die Vertex-Daten korrekt in die Textur geschrieben werden? Oder gibt es noch eine andere Möglichkeit? Vielleicht kann ja sogar der Vertex-Shader in eine Textur schreiben? Oder gibts eine Möglichkeit über den Geometrie-Shader?
Transform feedback! Genau sowas habe ich gesucht Ich hab gesehn, dass die Funktionen dazu sogar im Delphi-Header sind, kennt grad jemand dazu ein Tutorial welches die Funktionen grob beschreibt?
Was die Paraboliden Maps angeht: Ich finde der Nachteil der Artifakte kann man beheben und ich finde den Vorteil darin, dass ich für die Licht/Schatten-Berechnung einer Punktlichtquelle nur 2 Rendervorgänge und nicht 6 brauche wie bei der cubemap.
Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.